12. Java8新特性_Stream_归约与收集
package com.sggtwelve; import com.sggthree.Employee; import org.junit.Test; import java.util.*; import java.util.stream.Collectors; public class TestStreamAPI5 { /* 规约:reduce(BinaryOperator)- 可以将流中元素反复结合起来,得到一个值 */ List<Employee> employees = Arrays.asList( new Employee("张三",18,9999.99, Employee.Status.FREE), new Employee("李四",58,5555.55, Employee.Status.BUSY), new Employee("王五",26,3333.33, Employee.Status.VOCATION), new Employee("赵六",36,6666.66, Employee.Status.FREE), new Employee("田七",12,8888.88, Employee.Status.BUSY), new Employee("田七",12,8888.88, Employee.Status.BUSY) ); @Test public void test1(){ List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10); Integer sum = list.stream().reduce(0,(x,y) -> x+y); System.out.println(sum); System.out.println("--------------------------------"); Optional<Double> op = employees.stream() .map(Employee::getMoney) .reduce(Double::sum); System.out.println(op.get()); } /* 收集:collect-将流转换为其他形式。接收一个Collector接口的实现,用于给Stream中元素做汇总的方法 1.总数 2.平均值 3.总和 4.最大值 5.最小值 ============= 6.分组 ============= 7.多级分组 ============= 8.分区(满足条件一个区,不满足条件一个区) */ @Test public void test2(){ List<String> list = employees.stream() .map(Employee::getName) .collect(Collectors.toList()); list.forEach(System.out::println); System.out.println("================toList结束============"); Set<String> set = employees.stream() .map(Employee::getName) .collect(Collectors.toSet()); set.forEach(System.out::println); System.out.println("================toSet结束============"); HashSet<String> hashSet = employees.stream() .map(Employee::getName) .collect(Collectors.toCollection(HashSet::new)); hashSet.forEach(System.out::println); System.out.println("================toCollection结束============"); } @Test public void test3(){ //总数 Long count = employees.stream() .collect(Collectors.counting()); System.out.println(count); //平均值 Double money = employees.stream() .collect(Collectors.averagingDouble(Employee::getMoney)); System.out.println(money); //总和 Double moneySum = employees.stream() .collect(Collectors.summingDouble(Employee::getMoney)); System.out.println(moneySum); //最大值 Optional<Employee> optionalEmployee = employees.stream() .collect(Collectors.maxBy((e1,e2) -> Double.compare(e1.getMoney(),e2.getMoney()))); System.out.println(optionalEmployee.get()); //最小值 Optional<Double> min = employees.stream() .map(Employee::getMoney) .collect(Collectors.minBy(Double::compareTo)); System.out.println(min); } }