簡體   English   中英

如何使用Stream API更新Java 8中List中的每個元素

[英]How to update each element in a List in Java 8 using Stream API

我有一個List定義如下:

List<Integer> list1 = new ArrayList<>();
list1.add(1); 
list1.add(2);

如何在不創建新列表的情況下使用Java 8的Stream API將List的每個元素遞增一個(即最終使用List [2,3] )?

List創建Stream ,不允許按照程序包文檔“無干擾”部分中的說明Stream修改源List 不遵守此約束可能會導致ConcurrentModificationException或者更糟糕的是,導致數據結構損壞而不會出現異常。

使用Java Stream直接操作列表的唯一解決方案是創建一個不迭代列表本身的Stream,即迭代索引之類的流

IntStream.range(0, list1.size()).forEach(ix -> list1.set(ix, list1.get(ix)+1));

就像伊蘭的回答一樣

但是這里沒有必要使用Stream 目標可以簡單地實現

list1.replaceAll(i -> i + 1);

這是Java 8中引入的一種新的List方法 ,也允許平滑地使用lambda表達式。 除此之外,還有一個眾所周知的Iterable.forEach ,很好的Collection.removeIf和就地List.sort方法,用於命名其他不涉及Stream API的新Collection操作。 此外, Map接口有幾個值得了解的新方法。

另請參閱官方文檔中的“ 在Java SE 8中利用Lambda表達式和流的新增和增強的API ”。

霍爾格的答案很完美。 但是,如果您關注整數溢出,那么您可以使用Java 8中發布的另一個實用程序方法: Math#incrementExact 如果結果溢出int則會拋出ArithmeticException 方法參考也可以用於此,如下所示:

list1.replaceAll(Math::incrementExact);

您可以通過結合forEachIntStream迭代索引:

IntStream.range(0,list1.size()).forEach(i->list1.set(i,list1.get(i)+1));

然而,這與正常的for循環沒有太大的不同,並且可能不太可讀。

將結果重新分配給list1

list1 = list1.stream().map(i -> i+1).collect(Collectors.toList());
public static Function<Map<String, LinkedList<Long>>, Map<String, LinkedList<Long>>> applyDiscount = (

            objectOfMAp) -> {


        objectOfMAp.values().forEach(listfLong -> {


            LongStream.range(0, ((LinkedList<Long>) listfLong).size()).forEach(index -> {

                Integer position = (int) index;

                Double l = listfLong.get(position) - (10.0 / 100 * listfLong.get(position));

                listfLong.set(position, l.longValue());

            });

        });

        return objectOfMAp;

    };

暫無
暫無

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

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