[英]Rewrite traditional for loop to streams.map java 8
我正在嘗試測試Rest API
PUT
請求。 它是一個彈簧啟動應用程序。 PUT
請求用於在現有對象列表中進行更新
傳統的寫作方式正在發揮作用。
data
是內存中的數據——它是一個List<Bean>
並且name
(字符串類型)是在數據中找到對象的鍵, objectBean
是我們找到后要替換的鍵(即name
)
public void update(Bean objectBean, String name) {
for(int i = 0; i < data.size() ; i++) {
Bean l = data.get(i);
if(l.getName().equals(name)) {
data.set(i, objectBean);
return;
}
}
};
但我嘗試在 java 8 中使用 Stream 編寫。 下面是代碼
Data.stream().map(p -> p.getName().equals(name) ? objectBean: p );
但這給出了空列表。
在這里使用streams
只會使代碼更加復雜。
如果你真的想要你可以引入它來找到索引i
值。 之后就可以進行更換了。
IntStream.range(0, data.size())
.filter(i -> data.get(i).getName().equals(name)).findFirst()
.ifPresent(i -> data.set(i, objectBean));
鑒於data
是一些帶有Bean
對象的 List,您需要返回收集的流:
return data.stream()
.map(bean -> bean.getName().equals(name) ? objectBean : bean)
.collect(Collectors.toList());
如果data
是一個非空的 Iterable,那么輸出必須和map
使用Function
對象。 但是,這對於Stream
API 來說不是一個好的用例:
首先,流是為無副作用的目的而設計的(即創建新的數據結構而不是更新它們)。 流 API 支持forEach(Consumer<super T>)
,它是為副作用而設計的,但許多其他集合也支持,實際上,所有 Iterables,而諸如map
和flatMap
類的不可變操作則不支持。
其次,我看不到您程序的其余部分,但至少在此代碼段中,您似乎正在根據名稱更新數據結構,並且您假設名稱是唯一的,因為您一到達第一個Bean
就停止了使用您要查找的名稱。 考慮使用Map<String, Bean>
作為您的數據結構。
最后, streams
是惰性數據結構,這意味着在收集時會計算所有鏈式操作。 這提供了將大量計算鏈接在一起的動力 - 僅鏈接單個map
不會給您帶來任何性能優勢(盡管它確實給了您參考透明度)。
return data.stream()
.filter(bean -> bean.getName().equals(name))
.findAny()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.