讓我們假設開發中的一種非常正常的行為:我有一個 Collection 并且需要將此 Collection 映射到另一個對象。一個平面地圖場景。例子:我們有一些方法必須返回一組源對象:public Set<Source> getSources(String searchText);讓我們找出一種實現方式:public Set<Source> getSources(String searchText) { HashSet<Source> sources = new HashSet<>(); Set<String> urls = this.crawlerService.getUrls(searchText); urls.forEach(url -> sources.add(Source.builder().url(url).build())); return sources;}Java Stream 的另一種實現:public Set<Source> getSources(String searchText) { Set<String> urls = this.crawlerService.getUrls(searchText); return urls.stream() .flatMap(e -> Stream.of(Source.builder().url(e).build())) .collect(Collectors.toSet());}我更喜歡流方式,但我有一些問題:轉換為流和收集設置在性能方面有多昂貴?以這種方式使用 Stream 是可以接受的還是太過分了?還有其他一些使用 java Stream 來完成這種場景的最佳方法嗎?
1 回答

慕雪6442864
TA貢獻1812條經驗 獲得超5個贊
就性能而言,轉換為流和收集為設置的成本有多高?以這種方式使用 Stream 是可以接受的還是太過分了?
首先,流已經比簡單地創建一個新集合并使用循環向其中添加元素要昂貴,但除非您進行基準測試,否則您不會注意到這種成本。因此,繼續對這兩個示例進行基準測試。
如果您看一下 java 是如何實現流的,您會意識到它只是現有流的靈活包裝器java.util.Iterator,因此使用流所獲得的只是它們的靈活性(有時還有速度,但這不應該是賣點)
至于您的流示例,通過使用創建中間流會導致流變得昂貴flatMap。所有flatMap要做的就是撤消您在其中所做的操作并返回流的內容,因此您可能剛剛使用過map。
public Set<Source> getSources(String searchText) {
? Set<String> urls = this.crawlerService.getUrls(searchText);
? return urls.stream()
? ? ? ? ? ? ?.map(e -> Source.builder().url(e).build())
? ? ? ? ? ? ?.collect(Collectors.toSet());
}
添加回答
舉報
0/150
提交
取消