一、stream簡介
Java8中加入了一個新的包java.util.stream,這個包中包含了一些可以用來支持函數式編程風格的類。這些操作被稱為中間操作和最終操作。Stream的中間操作會返回一個新的Stream對象,比如filter、map、sorted等,而最終操作會返回一個結果,比如count、sum、reduce等。使用Stream的好處是可以把數據操作流程化,並且可以對數據進行並行處理。其中求和是Stream對象最常用的操作之一。
二、求和方法
Stream API提供了兩種求和方法,分別為sum()和reduce()。
1. sum()方法
IntStream intStream = IntStream.of(1, 2, 3, 4, 5);
int sum = intStream.sum();
sum()方法是IntStream接口提供的一個方法,可以對IntStream對象中的所有元素進行求和。上面的示例代碼中,我們首先創建了一個IntStream對象intStream,包含了1、2、3、4、5這5個元素。然後通過調用intStream.sum()方法,對這些元素進行求和,並將結果存儲在sum變量中。
2. reduce()方法
Stream stream = Stream.of(1, 2, 3, 4, 5);
int sum = stream.reduce(0, (a, b) -> a + b);
reduce()方法是Stream接口提供的一個方法,可以對Stream對象中的所有元素進行求和。上面的示例代碼中,我們首先創建了一個Stream對象stream,包含了1、2、3、4、5這5個元素。然後通過調用stream.reduce()方法,並傳入一個初始值0和一個Lambda表達式(a, b) -> a + b作為參數,對這些元素進行求和,並將結果存儲在sum變量中。
三、對基本類型求和
Java8的Stream API為基本數據類型提供了特化版本,使其更加高效。我們可以使用IntStream、LongStream、DoubleStream等特化接口來操作int、long、double等基本數據類型。
1. 對IntStream求和
int[] ints = {1, 2, 3, 4, 5};
int sum = Arrays.stream(ints).sum();
使用Arrays類的stream()方法可以將數組轉化為Stream。上面的示例代碼中,我們首先創建了一個包含了1、2、3、4、5這5個元素的int類型數組ints。然後通過調用Arrays.stream(ints)方法,將其轉化為IntStream類型的對象。調用sum()方法對這些元素進行求和,並將結果存儲在sum變量中。
2. 對LongStream和DoubleStream求和
long[] longs = {1L, 2L, 3L, 4L, 5L};
long sum = Arrays.stream(longs).sum();
double[] doubles = {1.0, 2.0, 3.0, 4.0, 5.0};
double sum = Arrays.stream(doubles).sum();
對於long和double類型的基本數據類型,也可以使用相同的方法進行求和。只需要使用LongStream或者DoubleStream類型的對象即可。
四、對對象求和
如果需要對一個類的某個屬性進行求和,可以使用Stream中的mapToInt()方法將對象映射為int類型,並對其進行求和。
示例代碼
public class Student {
private String name;
private int score;
public Student(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
public class Test {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student("Tom", 80));
students.add(new Student("Jack", 90));
students.add(new Student("Mary", 100));
int sum = students.stream().mapToInt(Student::getScore).sum();
System.out.println(sum);
}
}
上面的示例代碼中,我們首先創建了一個Student類,包含了name和score兩個屬性。然後創建了一個List對象students,裏面包含了3個Student對象。最後通過調用students.stream().mapToInt(Student::getScore).sum()方法,對students中每個Student對象的score屬性進行求和,並將結果存儲在sum變量中。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/283522.html