我有一个返回对象列表的函数。获取该列表后,我想将每个对象中的字段设置为相同的值。有没有办法可以将下面的三行(模拟)代码减少到一个?
List<someObjects> aList = functionReturningList();
aList.stream().forEach(m -> m.setField(fieldValue));
anotherList.addAll(aList);
答案 0 :(得分:5)
我真的不明白为什么你想在一行中做到这一点,但这是一种方式:
anotherList.addAll(functionReturningList()
.stream()
.map(m -> { m.setField(fieldValue); return m;})
.collect(Collectors.toList()));
一旦写完,它肯定比“单行”更多。除了map
正在执行副作用操作,收集器也在复制整个集合。因此,您的初始方法是更好。
List
也有forEach
,您无需流式传输即可获得该方法。
答案 1 :(得分:5)
我唯一想改变代码的是,当您只想stream()
时,省略forEach
来电:
List<someObjects> aList = functionReturningList();
aList.forEach(m -> m.setField(fieldValue));
anotherList.addAll(aList);
如果您真的坚持在一次操作中执行此操作,则可以使用
functionReturningList().forEach(m -> {
m.setField(fieldValue));
anotherList.add(m);
});
然而,这样做没有任何优势。如果存在任何可识别的性能差异,前者可能比后者更有效,因为它允许JVM将addAll
操作优化为单个内存传输。
答案 2 :(得分:0)
使用地图代替 foreach ,然后收集以列出 addAll 结果到另一个列表< / p>
见这个例子:
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> myList2 = new ArrayList<>();
myList2.addAll(myList.stream().map(x -> x = 0).collect(Collectors.toList()));
System.out.println(myList);
System.out.println(myList2);