[英]Set field of Objects in List to identical value and return a list
我有一個返回對象列表的函數。 獲取該列表后,我想將每個這些對象中的字段設置為相同的值。 有什么方法可以將下面的三行(模擬)代碼減少到一行?
List<someObjects> aList = functionReturningList();
aList.stream().forEach(m -> m.setField(fieldValue));
anotherList.addAll(aList);
我不太明白為什么要單行執行此操作,但這是一種方法:
anotherList.addAll(functionReturningList()
.stream()
.map(m -> { m.setField(fieldValue); return m;})
.collect(Collectors.toList()));
一旦寫完,肯定比“單行”要多得多。 此外, map
正在執行副作用操作,而收集器也在復制整個集合。 因此,您的初始方法是一種更好的方法。
而且List
也有forEach
,您不必流式傳輸即可獲得該方法。
我要在您的代碼中更改的唯一一件事是,當您只想執行forEach
時,將省略stream()
調用:
List<someObjects> aList = functionReturningList();
aList.forEach(m -> m.setField(fieldValue));
anotherList.addAll(aList);
如果您真的堅持要一次操作,可以使用
functionReturningList().forEach(m -> {
m.setField(fieldValue));
anotherList.add(m);
});
但是,這樣做是沒有好處的。 如果根本沒有可識別的性能差異,則前者可能比后者更有效,因為它允許JVM將addAll
操作優化到單個內存傳輸。
使用map代替foreach ,然后收集到列表並將所有結果添加到另一個列表
看這個例子:
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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.