我正在使用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对象的装箱,但不确定。
发布于 2018-11-01 10:10:06
您使用的不是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);这里有初始数组。你想做以下工作:
final步骤);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或START创建具有forEach的流。
发布于 2018-11-01 09:54:51
您正在为局部变量(a)分配一个新值,因此这不会影响第二个Stream ( List<Integer>)的源。请注意,这不是您使用List<Employee>所做的事情,您正在调用一个setter方法来改变List的元素。
因为Integer是不可变的,所以不能改变输入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));https://stackoverflow.com/questions/53098784
复制相似问题