首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java 8-具有对象和原始包装器的流

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

Stack Overflow用户
提问于 2018-11-01 09:50:41
回答 2查看 927关注 0票数 3

我正在使用java 8流,并试图在forEach终端操作中修改对象内容。

我在这里面临的问题是,我能够修改List<Employee>对象内容,但不能修改List<Integer>的内容。

代码片段如下:

代码语言:javascript
运行
复制
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对象的装箱,但不确定。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-01 10:10:06

您使用的不是Stream的最佳方法。一定要将Stream中的每一步看作已存在的修改(或创建新的)元素,并将其返回给Stream。最后,您将收到final结果,并且可以使用final方法之一来完成(并实际运行整个流工作) Stream

代码语言:javascript
运行
复制
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。一定要用一个:

代码语言:javascript
运行
复制
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,然后向流filtermap中添加两个步骤,然后向finalizeSTART创建具有forEach的流。

票数 3
EN

Stack Overflow用户

发布于 2018-11-01 09:54:51

您正在为局部变量(a)分配一个新值,因此这不会影响第二个Stream ( List<Integer>)的源。请注意,这不是您使用List<Employee>所做的事情,您正在调用一个setter方法来改变List的元素。

因为Integer是不可变的,所以不能改变输入List<Integer>的元素。

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

代码语言:javascript
运行
复制
List<Integer> newList = 
    listInteger.stream()
               .map(v -> v % 2 == 0 ? v + 1 : v)
               .collect(Collectors.toList());

或者您可以遍历List的索引,替换该List的一些元素。

代码语言:javascript
运行
复制
IntStream.range(0,listInteger.size())
         .filter(i -> listInteger.get(i) % 2 == 0)
         .forEach(i -> listInteger.set(i, listInteger.get(i + 1));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53098784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档