Stream归约与收集
public class TestLambda{
List<Employee> emps = Arrays.asList(
new Employee(101,"张三",18, Employee.Status.VOCATION),
new Employee(102,"李四",28, Employee.Status.VOCATION),
new Employee(103,"王五",38, Employee.Status.FREE),
new Employee(104,"赵六",48, Employee.Status.BUSY),
new Employee(104,"赵六",48, Employee.Status.BUSY),
new Employee(105,"田七",58, Employee.Status.BUSY)
);
/**
* 归约
* reduce(T identity,BinaryOperator) /reduce(BinrayOperator)
* -- 可以将流中的元素反复结合起来,得到一个值
* 问题:为什么都是两个计算,而返回值不一样呢?
* 因为第一个计算不会为空,第二 计算有可能为null,为了避免空指针
**/
@Test
public void test(){
List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
Integer num = list.stream() //0是一个初始值
.reduce(0,(x,y) -> x + y);
System.out.println(num)
System.out.println("-------------------------")
Optional op = emps.stream()
.map(Employee::getAge)
.reduce(Integer::sum);
System.out.println(op.get());
}
/**
* 收集
* collect -- 将流转换成其他形式,接收一个Collector接口实现,
* 用于给Stream中元素做汇总的方法
**/
public void test1(){
List<String> list = emps.stream()
.map(Employee::getName)
.collect(Collectors.toList());
list.forEach(System.out::println);
System.out.println("---------------------");
Set<String> set = emps.stream()
.map(Employee::getName)
.collect(Collectors.toSet());
set.forEach(System.out::println);
HashSet hs = emps.stream()
.map(Employee::getName)
.collect(Collectors.toCollection(HashSet::new));
hs.forEach(System.out::println);
}
@Test
public void test2(){
//总数
Long count = emps.stream()
.collect(Collectors.counting());
System.out.println(count);
//平均值
Double avg = emps.stram()
.collect(Collecors.avergingInt(Employee::getAge));
System.out.println(avg);
//总和
Integer num = emps.stream();
.collect(Collectors.summingInt(Employee::getAge));
System.out.println(num);
//最大
Optional<Employee> op = emps.stream()
.collect(Collectors.maxBy(e1,e2) ->
Integer.compare(e1.getAge(),e2.getAge()));
System.out.println(op.get());
//最小
Optional<Integer> min = emps.stream()
.collect(Collectors.minBy(Integer::compare));
System.out.println(min.get());
}
@Test
public void test3(){
//分组
Map<Status,List<Employee>> map = emps.stream()
.collect(Collectors.groupingBy(Employee::getStatus));
System.out.println(map);
//多级分组
Map<Status,Map<String,List<Employee>>> map1 = emps.stream()
.collect(Collectors.groupingBy(Employee::getStatus,Collectors.groupingBy((e)->{
if(((Employee)e).getAge()<=35){
return "青年";
}else if(((Employee)e).getAge<=50 && ((Employee)e).getAge>=36){
return "中年";
}else{
return "老年";
}
})))
System.out.println(map1);
System.out.println("------------------------------");
//分区
Map<Boolean,List<Employee>> map3 = emps.stream()
.collect(Collectors.partitioningBy((e)-> e.getAge() > 40));
System.out.println(map3);
//统计
DoubleSummaryStatistics dss = emps.stream()
.collect(Collectors.summarizingDouble(Employee::getAge));
System.out.println(dss.getSum());
System.out.println(dss.getAverage());
System.out.println(dss.getMax());
//连接
String str = emps.stream()
.map(Employee::getName)
//.collect(Collectors.joining(""));//只是拼接收到字符什么都不加
//.collect(Collectors.joining(","));//每个名字中间增加一个逗号
.collect(Collectors.joining(",","----","===="));//字符串首尾加特殊字符
System.out.println(str);
}
}