用Java流求和
1.簡介
在本快速教程中,我們將展示使用Stream API**計算整數之和的**各種方法。
為了簡單起見,我們將在示例中使用整數。但是,我們也可以將相同的方法應用於多頭和雙頭。
2.使用Stream.reduce()
Stream.reduce()
是**對stream的元素進行歸約**的終端操作。
它將二進制運算符(累加器)應用於流中的每個元素,其中第一個操作數是上一個應用程序的返回值,第二個操作數是當前流元素。
在使用reduce()
方法的第一種方法中,累加器函數是一個lambda表達式,該表達式將兩個Integer
值相加並返回一個Integer
值:
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
.reduce(0, (a, b) -> a + b);
以同樣的方式,我們可以使用一個已經存在的Java方法:
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
.reduce(0, Integer::sum);
或者我們可以定義並使用我們的自定義方法:
public class ArithmeticUtils {
public static int add(int a, int b) {
return a + b;
}
}
然後,我們可以將此函數作為參數傳遞給reduce()
方法:
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
.reduce(0, ArithmeticUtils::add);
3.使用Stream.collect()
計算整數列表之和的第二種方法是使用collect()
終端操作:
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
.collect(Collectors.summingInt(Integer::intValue));
同樣, Collectors
類提供summingLong()
和summingDouble()
方法分別計算long和double的總和。
4.使用IntStream.sum()
Stream API為我們提供了**mapToInt()
中間操作,該操作將我們的流轉換為IntStream
對象**。
該方法將一個映射器作為參數,用於執行轉換,然後,我們可以調用sum()
方法來計算流元素的總和。
讓我們看一下如何使用它的簡單示例:
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
Integer sum = integers.stream()
.mapToInt(Integer::intValue)
.sum();
以相同的方式,我們可以使用mapToLong()
和mapToDouble()
方法分別計算long和double的總和。
5.將Stream#sum
與Map
要計算Map<Object, Integer>
數據結構的值總和,首先我們根據該Map
的值創建一個流,然後應用先前使用的方法之一。
例如,通過使用IntStream.sum()
:
Integer sum = map.values()
.stream()
.mapToInt(Integer::valueOf)
.sum();
6.對對象使用Stream#sum
假設我們有一個對象列表,並且想計算這些對像給定字段的所有值的總和。
例如:
public class Item {
private int id;
private Integer price;
public Item(int id, Integer price) {
this.id = id;
this.price = price;
}
// Standard getters and setters
}
接下來,假設我們要計算以下列表中所有項目的總價:
Item item1 = new Item(1, 10);
Item item2 = new Item(2, 15);
Item item3 = new Item(3, 25);
Item item4 = new Item(4, 40);
List<Item> items = Arrays.asList(item1, item2, item3, item4);
在這種情況下,為了使用前面示例中顯示的方法計算總和,我們需要調用map()
方法將流轉換為整數流。
結果,我們可以使用Stream.reduce(),
Stream.collect(), and
IntStream.sum()
來計算總和:
Integer sum = items.stream()
.map(x -> x.getPrice())
.reduce(0, ArithmeticUtils::add);
Integer sum = items.stream()
.map(x -> x.getPrice())
.reduce(0, Integer::sum);
Integer sum = items.stream()
.map(item -> item.getPrice())
.reduce(0, (a, b) -> a + b);
Integer sum = items.stream()
.map(x -> x.getPrice())
.collect(Collectors.summingInt(Integer::intValue));
items.stream()
.mapToInt(x -> x.getPrice())
.sum();
7.對String
使用Stream#sum
假設我們有一個包含一些整數的String
對象。
要計算這些整數的總和,首先,我們需要將該String
轉換為Array
,然後需要過濾掉非整數元素,最後將該數組的其餘元素轉換為數字。
讓我們看看所有這些實際步驟:
String string = "Item1 10 Item2 25 Item3 30 Item4 45";
Integer sum = Arrays.stream(string.split(" "))
.filter((s) -> s.matches("\\d+"))
.mapToInt(Integer::valueOf)
.sum();
8.結論
在本教程中,我們看到了幾種如何使用Stream API計算整數列表之和的方法。同樣,我們使用這些方法來計算對象列表的給定字段的值總和,映射值的總和以及給定String
像中的數字。
與往常一樣,完整的代碼可以在GitHub上找到。