![](/img/trans.png)
[英]How to add each element in of two list using stream api in java
[英]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);
您可以通過結合forEach
的IntStream
迭代索引:
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.