java 迭代并修改每个元素并返回输出列表[duplicate]

oalqel3c  于 2022-12-21  发布在  Java
关注(0)|答案(1)|浏览(153)
    • 此问题已存在**:

Java Stream : Iterate through each element , apply condition and and generate output [closed]
2天前关闭。
我需要迭代下面XML中的每个标记,在检查一些条件之后,我需要生成一个输出XML
输入XML:

<NameList>
   <Name>
       <Name>test1</Name>
       <nameType>
          <set>nameType</set>
          <entry>set3</entry>
       </nameType>
   </Name>
   <Name>
       <Name>test2</Name>
       <nameType>
         <set>nameType</set>
         <entry>set4</entry>
       </nameType>
   </Name>
<NameList>

需要在输入XML中应用条件:

  • 如果entry == set3,则添加标记
  • 如果entry == set4,则将整个标签设置为空

输出XML将如下所示:

<NameList>
           <Name>
               <Name>test1</Name>
               <nameType>
                  <set>nameType</set>
                  <entry>set3</entry>
                  <date>2022-03-03</date>
               </nameType>
           </Name>
        <NameList>

实施代码:

nameList.stream()
      .forEach(name -> {
         if(name.getNameType().getEntry().equals("set3")) {
            name.setDate(date);
         } 
         if (name.getNameType().getEntry().equals("set4")) {
           name.setName(null);
           name.setDate(null);
           ........
        }   
      }

使用上面的代码,它将null设置为name object,并得到如下输出

<NameList/>
cld4siwp

cld4siwp1#

您不能(安全地)使用.forEach从集合中移除元素,当然也不能使用它从流中移除元素。(不完全正确:流或多或少是只读的)。
相反,您希望filter您的流:

var filteredNameList = nameList.stream()
      .filter(name -> !name.getNameType().getEntry().equals("set4"))
      .collect(Collectors.toList();

filteredNameList
      .forEach(name -> {
         if(name.getNameType().getEntry().equals("set3")) {
            name.setDate(date);
         }
      );

第二条语句可以再次替换为过滤流,以改变基础集合,使其更简洁:

filteredNameList.stream()
      .filter(name -> name.getNameType().getEntry().equals("set3"))
      .forEach(name -> name.setDate(date));

相关问题