亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

只用Java Stream來映射好不好?

只用Java Stream來映射好不好?

慕萊塢森 2023-07-19 10:00:48
讓我們假設開發中的一種非常正常的行為:我有一個 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());

}

查看完整回答
反對 回復 2023-07-19
  • 1 回答
  • 0 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號