用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#sumMap

要計算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上找到