Java8-具有对象和基本包装器的流

Java8-具有对象和基本包装器的流,java,java-8,java-stream,Java,Java 8,Java Stream,我正在使用Java8流,并尝试在forEach终端操作中修改对象内容 我在这里面临的问题是,我能够修改列表对象内容,但不能修改列表 代码片段如下所示: public static void streamExample() { List<Employee> listEmp = Arrays.asList(new Employee()); listEmp.stream().forEach(a -> a.setEmptName("John Doe")); l

我正在使用Java8流,并尝试在forEach终端操作中修改对象内容

我在这里面临的问题是,我能够修改
列表
对象内容,但不能修改
列表

代码片段如下所示:

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);

}
publicstaticvoidstreamexample(){
List listEmp=Arrays.asList(new Employee());
listEmp.stream();
listEmp.stream().forEach(System.out::println);
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
操作时取消了整型对象的装箱,但不确定。

您正在为局部变量(
a
)分配一个新值,这样就不会影响第二个
流的源(您的
列表
)。请注意,这不是您对
列表所做的操作,您正在调用setter方法来改变
列表的元素

由于
Integer
s是不可变的,因此不能对输入
列表的元素进行变异

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

List<Integer> newList = 
    listInteger.stream()
               .map(v -> v % 2 == 0 ? v + 1 : v)
               .collect(Collectors.toList());
IntStream.range(0,listInteger.size())
         .filter(i -> listInteger.get(i) % 2 == 0)
         .forEach(i -> listInteger.set(i, listInteger.get(i + 1));

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

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);

注意:
流。of(…)
创建一个
,然后我们向流添加两个步骤
过滤器
映射
,然后
完成
开始使用
forEach
创建流这与元素类型无关。像
forEach(a->a=a+1)
这样的操作是没有意义的,因为您只是在修改参数
a
。在Java中,修改参数变量对调用方没有影响。这一原则也被称为“传递值”。
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