public class StreamCollect {
List<Employee> employees = new ArrayList<>();
{
employees.add(new Employee(1, "张三", 20, 8895.31, true));
employees.add(new Employee(2, "张四", 28, 7894.34, true));
employees.add(new Employee(3, "张柳", 46, 6895.37, false));
employees.add(new Employee(66, "王一", 54, 5895.5, true));
employees.add(new Employee(56, "李四", 55, 4895.8, false));
employees.add(new Employee(89, "李十一", 32, 9895.354, false));
employees.add(new Employee(546, "张十五", 20, 18895.37, false));
employees.add(new Employee(43, "刘十六", 43, 28895.35, true));
employees.add(new Employee(66, "刘十六", 43, 28895.35, false));
}
/**
* 测试reduce(T identity, BinaryOperator b)方法 可以将流中的数据反复结合起来,得到一个值。返回 T
*/
@Test
public void testStreamCollect() {
//1. 将流中元素收集到List
List<Employee> collect = employees.stream().collect(Collectors.toList());
//2. 将流中元素收集到Set
Set<Employee> collect1 = employees.stream().collect(Collectors.toSet());
//3. 将流中元素收集到创建的集合
Collection<Employee> collect2 = employees.stream().collect(Collectors.toCollection(ArrayList::new));
//4. 计算流中的元素个数
Long collect3 = employees.stream().collect(Collectors.counting());
System.out.println("流中的元素个数是:"+collect3);
//5. 对流中元素的整数属性求和
IntSummaryStatistics sumAge = employees.stream().collect(Collectors.summarizingInt(Employee::getAge));
System.out.println("流中的元素年龄相加是:"+sumAge);
//6. 对流中元素的整数属性求平均值
Double averageAge = employees.stream().collect(Collectors.averagingInt(Employee::getAge));
System.out.println("流中的元素年龄平均值是:"+averageAge);
//7. 连接流中的每个字符串
String join = employees.stream().map(Employee::getName).collect(Collectors.joining("_"));
System.out.println("流中的元素姓名连接后是:"+join);
//8. 其中的最大值
Optional<Employee> collect4 = employees.stream().collect(Collectors.maxBy(Comparator.comparingDouble(Employee::getSalary)));
System.out.println("流中的元素工资最高的是:"+collect4.get());
//9. 其中的最小值
Optional<Employee> min = employees.stream().collect(Collectors.minBy(Comparator.comparingDouble(Employee::getSalary)));
System.out.println("流中的元素工资最低的是:"+min.get());
//10. 归约产生的类型 从第0个元素累加
Integer collect5 = employees.stream().collect(Collectors.reducing(0, Employee::getAge, Integer::sum));
System.out.println("归约:"+collect5);
//11. 分组,比较常用
Map<Integer, List<Employee>> collect6 = employees.stream().collect(Collectors.groupingBy(Employee::getAge));
System.out.println("分组:"+collect6);
//12. 分区,根据TRUE或者FALSE进行分区
Map<Boolean, List<Employee>> collect7 = employees.stream().collect(Collectors.partitioningBy(Employee::getStatus));
System.out.println("分区:"+collect7);
}
}