簡體   English   中英

將傳統的 for 循環重寫為streams.map java 8

[英]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,而諸如mapflatMap類的不可變操作則不支持。

其次,我看不到您程序的其余部分,但至少在此代碼段中,您似乎正在根據名稱更新數據結構,並且您假設名稱是唯一的,因為您一到達第一個Bean就停止了使用您要查找的名稱。 考慮使用Map<String, Bean>作為您的數據結構。

最后, streams是惰性數據結構,這意味着在收集時會計算所有鏈式操作。 這提供了將大量計算鏈接在一起的動力 - 僅鏈接單個map不會給您帶來任何性能優勢(盡管它確實給了您參考透明度)。

return data.stream()
    .filter(bean -> bean.getName().equals(name))
    .findAny()

暫無
暫無

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

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