本文主要讲解:Java 8 Stream之Collectors.groupingBy()分组示例。基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,用于解决集合类库既有的鼻端
Collectors.groupingBy() 分组之常见用法
1、基本用法:按某一字段分组汇总,返回列表。
public void groupingByCity() {
Map<String, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity));
map.forEach((k, v) -> {
System.out.println(k + " = " + v);
});
}
2、分组之统计每个分组,包含count,average,sum,join等。
public void groupingByCount() {
//count
Map<String, Long> map = employees.stream()
.collect(Collectors.groupingBy(Employee::getCity, Collectors.counting()));
//average
Map<String, Double> map = employees.stream()
.collect(Collectors.groupingBy(Employee::getCity, Collectors.averagingInt(Employee::getAge)));
//sum
Map<String, Long> map = employees.stream()
.collect(Collectors.groupingBy(Employee::getCity, Collectors.summingLong(Employee::getAmount)));
//Join分组List
Map<String, String> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity,
Collectors.mapping(Employee::getName, Collectors.joining(", ", "Names: [", "]"))));
}
3、需要对结果集进行 筛选,去重,排序
Map<String, List<Employee>> map = employees.stream()
.filter(e->e.getCity.equal("北京"))
.collect(Collectors.groupingBy(Employee::getCity));
// 对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);
});
4、排序与截取前几位的结合
public void groupingByCity() {
Map<String, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity));
Comparator<Employee> byslsj =Comparator.comparing(Employee::getslsj);//时间升序
map.forEach((k, v) -> {
//按时间升序,并且取第一个值
v.stream.sorted(bySlsj).limit(1);
System.out.println(k + " = " + v);
});
}
5、map():将流中的元素进行再次加工形成一个新流,流中的每一个元素映射为另外的元素。
int maxHeight = employeeList
.stream()
.mapToInt(Employee::getHeight)
.max()
.getAsInt();