六、Lambda Stream归约与收集

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);	
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值