Java Stream –减少操作并减少方法
时间:2020-01-09 10:35:15 来源:igfitidea点击:
在这篇文章中,我们将看到Java Stream API中的还原操作以及如何使用通用的还原操作Stream.reduce()方法。
Java Stream中的归约运算
在Java Stream API中,有许多终端操作(例如平均值,总和,最小值,最大值和计数),它们通过组合流的内容来返回一个值。这些操作称为归约操作。
例如,使用减少计数操作对列表中的元素数进行计数。
List<Integer> myList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
long count = myList.stream().count();
System.out.println("Count of elements in the list- " + count);
输出:
Count of elements in the list- 10
减少Java Stream中的方法
Java Stream API还具有通用的reduce方法,该方法使用传递的累加器对流的元素执行约简操作,并返回约简值。 Reduce方法已重载,并具有3个变体。
- Optional <T> reduce(BinaryOperator <T>累加器)–使用关联累加函数对该流的元素执行归约,并返回一个Optional描述缩减值(如果有)。
累加器的类型为BinaryOperator,它是一个功能接口,表示对两个相同类型的操作数的操作。累加器函数具有两个参数:约简的部分结果和流的下一个元素。
带有累加器示例的Stream.reduce()
假设有一个Employee类,其中包含name,dept,salary字段。我们需要使用Stream.reduce()方法找出总薪水。
public class Employee {
private String name;
private String dept;
private int salary;
Employee(String name, String dept, int salary){
this.name = name;
this.dept = dept;
this.salary = salary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
}
通过传递一个累加器函数来使用reduce方法,该函数在本示例中是一个lambda表达式,该函数将两个Integer值相加并返回一个Integer值,我们可以获得总工资。
List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee("Hyman", "Finance", 5500));
employeeList.add(new Employee("Lisa", "Accounts", 5600));
employeeList.add(new Employee("Nikita", "IT", 4500));
employeeList.add(new Employee("Tony", "HR", 8000));
Optional<Integer> totalSalary = employeeList.stream().map(e -> e.getSalary()).reduce((a,b) -> a+b);
if(totalSalary.isPresent()){
System.out.println("Total Salary- " + totalSalary.get());
}
输出:
Total Salary- 23600
- reduce(T标识,BinaryOperator <T>累加器)–使用提供的标识值和关联的累加函数对该流的元素执行精简,并返回精简后的值。
- identity –如果流中没有元素,则identity元素既是reduce的初始值,又是默认结果。
- 累加器-累加器功能是BinaryOperator的实现,它是一个功能接口,表示对两个相同类型的操作数的操作。累加器函数有两个参数:减少的部分结果和流的下一个元素
带身份和累加器的Stream.reduce()示例
我们可以使用与上面相同的示例,只是reduce方法中有变化,该方法现在还传递一个标识元素0。这是工资总和的初始值,如果集合employeeList中没有成员,则为默认值。
现在reduce方法的返回类型也是int。
List<Employee> employeeList = new ArrayList<>();
employeeList.add(new Employee("Hyman", "Finance", 5500));
employeeList.add(new Employee("Lisa", "Accounts", 5600));
employeeList.add(new Employee("Nikita", "IT", 4500));
employeeList.add(new Employee("Tony", "HR", 8000));
int totalSalary = employeeList.stream().map(e -> e.getSalary()).reduce(0, (a,b) -> a+b);
System.out.println("Total Salary- " + totalSalary);
- reduce(U标识,BiFunction <U 、?超级T,U>累加器,BinaryOperator <U>组合器)–使用提供的标识,累加和组合函数对流的元素进行归约。
合并器功能用于合并累加器功能的结果,它必须与累加器功能兼容。当使用并行流以合并并行运行的累加器的结果时,合并器功能是必需的。
带有身份,累加器和合并器的Stream.reduce()示例
int value = Stream.of(1, 2, 3, 4, 5).parallel().reduce(1, (a, b) -> a*b,
(x,y) -> { System.out.println("In combiner function");
return x*y;});
System.out.println("Value- " + value);
输出:
In combiner function In combiner function In combiner function In combiner function Value- 120

