簡體   English   中英

收集后在Java 8流中對對象的調用方法

[英]Calling method on object in Java 8 stream after collecting

假設我有這段代碼:

Map<Consumer, Item> map = myStream.parallel()
        .filter(Objects::nonNull)
        .collect(Collectors.toConcurrentMap(e->e,
                e->e, mergeFunction));

我想做的是在收集完成后在流的每個對象上調用一個方法。

例如,

item.setDate(item.getOneDate());

在完成的代碼依次遍歷各個項目之前,將它們放入地圖中,最后像上面的代碼一樣調用一部分代碼,設置一個“日期”。

while(iterator.hasNext()) {
   Item blah = iterator.next();
   ....
   // code for putting into map
   ...
   blah.setDate(blah.getOneDate());
}

不確定如何使用Java 8流。 forEach peek

如果必須在執行collect操作之后執行此操作,請使用forEach

map.forEach((k, v) -> {...});

如果您只對值感興趣:

map.values().forEach(item -> {...});

或僅按鍵:

map.keySet().forEach(item -> {...});

這將引起爭議 ,但我將使用peek()

myStream.parallel()
        .filter(Objects::nonNull)
        .peek(item -> item.setDate(item.getOneDate()))

IMO,此用例使反對使用peek()進行狀態修改的許多參數無效,因為它基本上沒有副作用(假定不再可以從流源訪問元素)。 它絕對符合不干擾的唯一嚴格要求。

我同意吉加爾·喬希Jigar Joshi)的觀點 map操作更加簡潔。 如果不需要中間對象,則返回相同的對象:

myStream.parallelStream()
        .map(i -> { i.setDate(i.getOneDate()); return i; })
        ...

也就是說,我將避免在Stream的中間對對象進行變異。 這是不好的做法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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