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

pad*_*ino 1 java java-8 java-stream

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

List<someObjects> aList = functionReturningList();
aList.stream().forEach(m -> m.setField(fieldValue));
anotherList.addAll(aList);
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 5

我真的不明白为什么你想在一行中做到这一点,但这是一种方式:

 anotherList.addAll(functionReturningList()
                      .stream()
                      .map(m -> { m.setField(fieldValue); return m;})
                      .collect(Collectors.toList()));
Run Code Online (Sandbox Code Playgroud)

一旦编写完成,它肯定比"单行"更多.除了map执行副作用操作,收集器也复制整个集合.因此,您最初的方法更好.

并且List也有forEach,你没有必要流来获得该方法.

  • 这延伸了"线"一词.除了通过在映射函数中执行副作用来滥用API之外,通过执行整个列表的过时复制步骤而不是仅将它们直接添加到目标列表,它比OP的原始代码效率低. (2认同)

Hol*_*ger 5

唯一的,我会在你的代码中改变,就是stream()在你想做的时省略调用forEach:

List<someObjects> aList = functionReturningList();
aList.forEach(m -> m.setField(fieldValue));
anotherList.addAll(aList);
Run Code Online (Sandbox Code Playgroud)

如果你真的坚持在一次操作中这样做,你可以使用

functionReturningList().forEach(m -> {
    m.setField(fieldValue));
    anotherList.add(m);
});
Run Code Online (Sandbox Code Playgroud)

但是,这样做是没有优势的.如果存在任何可识别的性能差异,前者可能比后者更有效,因为它允许JVM将addAll操作优化为单个内存传输.