Java8 Stream 之groupingBy 分组

/**
	 * 使用java8 stream groupingBy操作,按城市分组list
	 */
	public void groupingByCity() {
		Map<String, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity));
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作,按城市分组list统计count
	 */
	public void groupingByCount() {
		Map<String, Long> map = employees.stream()
				.collect(Collectors.groupingBy(Employee::getCity, Collectors.counting()));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作,按城市分组list并计算分组年龄平均值
	 */
	public void groupingByAverage() {
		Map<String, Double> map = employees.stream()
				.collect(Collectors.groupingBy(Employee::getCity, Collectors.averagingInt(Employee::getAge)));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作,按城市分组list并计算分组销售总值
	 */
	public void groupingBySum() {
		Map<String, Long> map = employees.stream()
				.collect(Collectors.groupingBy(Employee::getCity, Collectors.summingLong(Employee::getAmount)));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
		});
 
		// 对Map按照分组销售总值逆序排序
		Map<String, Long> sortedMap = new LinkedHashMap<>();
		map.entrySet().stream().sorted(Map.Entry.<String, Long> comparingByValue().reversed())
				.forEachOrdered(e -> sortedMap.put(e.getKey(), e.getValue()));
 
		sortedMap.forEach((k, v) -> {
			System.out.println(k + " = " + v);
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作,按城市分组list并通过join操作连接分组list中的对象的name 属性使用逗号分隔
	 */
	public void groupingByString() {
		Map<String, String> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity,
				Collectors.mapping(Employee::getName, Collectors.joining(", ", "Names: [", "]"))));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的List
	 */
	public void groupingByList() {
		Map<String, List<String>> map = employees.stream().collect(
				Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toList())));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
			v.stream().forEach(item -> {
				System.out.println("item = " + item);
			});
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的Set
	 */
	public void groupingBySet() {
		Map<String, Set<String>> map = employees.stream().collect(
				Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet())));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
			v.stream().forEach(item -> {
				System.out.println("item = " + item);
			});
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作,通过Object对象的成员分组List
	 */
	public void groupingByObject() {
		Map<Manage, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(item -> {
			return new Manage(item.getName());
		}));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作, 基于city 和name 实现多次分组
	 */
	public void groupingBys() {
		Map<String, Map<String, List<Employee>>> map = employees.stream()
				.collect(Collectors.groupingBy(Employee::getCity, Collectors.groupingBy(Employee::getName)));
 
		map.forEach((k, v) -> {
			System.out.println(k + " = " + v);
			v.forEach((i, j) -> {
				System.out.println(i + " = " + j);
			});
		});
	}
 
	/**
	 * 使用java8 stream groupingBy操作, 基于Distinct 去重数据
	 */
	public void groupingByDistinct() {
		List<Employee> list = employees.stream().filter(distinctByKey(Employee :: getCity))
				.collect(Collectors.toList());;
 
		list.stream().forEach(item->{
			System.out.println("city = " + item.getCity());
		});
		
		
	}
 
	/**
	 * 自定义重复key 规则
	 * @param keyExtractor
	 * @return
	 */
	private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
		Set<Object> seen = ConcurrentHashMap.newKeySet();
		return t -> seen.add(keyExtractor.apply(t));
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值