将List中的Objects字段设置为相同的值并返回一个列表

时间:2017-05-22 08:57:50

标签: java java-8 java-stream

我有一个返回对象列表的函数。获取该列表后,我想将每个对象中的字段设置为相同的值。有没有办法可以将下面的三行(模拟)代码减少到一个?

List<someObjects> aList = functionReturningList();
aList.stream().forEach(m -> m.setField(fieldValue));
anotherList.addAll(aList);

3 个答案:

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