为了账号安全,请及时绑定邮箱和手机立即绑定

Java 8 - 带有对象和原始包装器的流

Java 8 - 带有对象和原始包装器的流

MMMHUHU 2021-12-22 19:05:58
我正在使用 java 8 流并尝试修改 forEach 终端操作中的对象内容。我在这里面临的问题是我可以修改List<Employee>对象内容但不能修改对象的内容List<Integer>代码片段如下:public static void streamExample() {    List<Employee> listEmp = Arrays.asList(new Employee());    listEmp.stream().forEach(a -> a.setEmptName("John Doe"));    listEmp.stream().forEach(System.out::println);    List<Integer> listInteger = Arrays.asList(2, 4, 6, 8, 12,17, 1234);    listInteger.stream().filter(v -> v % 2 == 0).forEach(a -> a=a+1);    listInteger.stream().forEach(System.out::println);}我想知道更改没有反映在列表中,因为在执行a=a+1操作时取消装箱 Integer 对象但不确定。
查看完整描述

2 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

您使用的不是最佳方法Stream。请务必将其中的每一步都Stream视为修改现有(或创建新)元素并将其返回到Stream. 最后您会收到final结果,您可以使用其中一种final方法来完成(并实际运行整个流工作)Stream:


List<Integer> listInteger = Arrays.asList(2, 4, 6, 8, 12, 17, 1234);

listInteger.stream().filter(v -> v % 2 == 0).forEach(a -> a = a + 1);

listInteger.stream().forEach(System.out::println);

这里有初始数组。您想要执行以下操作:

  1. 过滤掉一些元素(这不是final一步);

  2. 打印过滤的元素(这是final步骤)。

为此,您不必创建Streams两次。请使用一个:

Stream.of(2, 4, 6, 8, 12, 17, 1234)    // create stream (there're many way to do it)

      .filter(v -> v % 2 == 0)         // filter out required elements

      .map(v -> v + 1)                 // transform elements using given rule

      .forEach(System.out::println);   // finalize stream with printing out each element separately

注: Stream.of(...)创建一个Stream,然后我们添加两个步骤流filter和map再finalize或启动创建流与forEach。


查看完整回答
反对 回复 2021-12-22
?
达令说

TA贡献1821条经验 获得超6个赞

您正在为局部变量 ( a)分配一个新值,因此这不会影响第二个Stream(your List<Integer>)的来源。请注意,这不是您List<Employee>对List.


由于Integers 是不可变的,因此您无法改变 input 的元素List<Integer>。


相反,您可以创建一个新的List:


List<Integer> newList = 

    listInteger.stream()

               .map(v -> v % 2 == 0 ? v + 1 : v)

               .collect(Collectors.toList());

或者您可以流式传输您的 索引List,并替换其中的一些元素List:


IntStream.range(0,listInteger.size())

         .filter(i -> listInteger.get(i) % 2 == 0)

         .forEach(i -> listInteger.set(i, listInteger.get(i + 1));


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号