簡體   English   中英

將“列表中的對象”字段設置為相同的值並返回一個列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM