Collectors 基本使用
首先我們先了解一下,Collectors
可以幫我們完成的事情,例如:分組、排序(支持多字段排序)、最大值、最小值、平均值,簡單的來說,以前我們在數(shù)據(jù)上面用sql 去完成的聚合相關的操作,Collectors
都可以完成。ps:剛剛開始嘗試寫一些原創(chuàng)文章,寫的不好,請大家見諒~
先準備數(shù)據(jù)
private List<String> list = new ArrayList<>();
List<Users> users;
@Before
public void load() {
list.add("張三");
list.add("李四");
list.add("王五");
list.add("趙六");
users = Arrays.asList(new Users(1, "張三", 18),
new Users(2, "李四", 30),
new Users(3, "王五", 20),
new Users(4, "趙六", 18));
}
分組
@Test
public void groupingBy() {
users.stream().collect(Collectors.groupingBy(Users::getAge)).forEach((key, value) -> {
System.out.println(key + " ---" + value);
});
}
分組,然后取最大的值
@Test
public void groupingByMax() {
//分組后去最大值
Map<Integer, Optional<Users>> collect = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.maxBy(Comparator.comparing(Users::getId))));
//分組后去最小值
Map<Integer, Optional<Users>> collect2 = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.minBy(Comparator.comparing(Users::getId))));
collect.forEach((key, value) -> {
System.out.println("key " + key + " " + "value : " + value);
});
System.out.println("---------------------");
collect2.forEach((key, value) -> {
System.out.println("key " + key + " " + "value : " + value);
});
}
分組后,把原始對象進行轉換為新的對象
@Test
public void mapping() {
Map<Integer, List<String>> collect = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.mapping( item ->{
//當然你這里也可以構建一個新的對象,進行返回
return item.getName();
}, Collectors.toList())));
// Map<Integer, List<Object>> collect = users.stream().collect(Collectors.groupingBy(Users::getAge, Collectors.mapping(item ->{ return Arrays.asList(item); }, Collectors.toList())));
collect.forEach((key, value) -> {
System.out.println("key : " + key + "value :" + value);
});
}
單字段進行排序
/**
* 單字段進行排序
*/
@Test
public void sort() {
//倒序
System.out.println("倒序");
users.stream().sorted(Comparator.comparing(Users::getAge).reversed()).collect(Collectors.toList()).forEach(item -> {
System.out.println(item.getAge());
});
System.out.println("升序");
//升序
users.stream().sorted(Comparator.comparing(Users::getAge)).collect(Collectors.toList()).forEach(item -> {
System.out.println(item.getAge());
});
}
結果
image.png
多字段進行排序(comparator)
/**
* 排序 、多條件排序,注意事項,排序的字段不能為空
*/
@Test
public void comparator() {
/**
*
* 手動控制排序(復雜業(yè)務的時候,可以采用該種方法)
* 1、年齡倒敘
* 2、id 升序
*
*/
Comparator<Users> usersComparator = Comparator.comparing(Users::getAge, (o1, o2) -> {
// 倒敘
return o2.compareTo(o1);
}).thenComparing(Users::getId, (o1, o2) -> {
// 升序
return o1.compareTo(o2);
});
List<Users> collect = users.stream().sorted(usersComparator).collect(Collectors.toList());
collect.forEach(item -> {
System.out.println(item);
});
System.out.println("----------------------------------");
/**
*
* 第二種排倒序方法
* Comparator.reverseOrder 倒敘
* Comparator.naturalOrder 升敘
*
* 1、年齡倒敘
* 2、id 倒序
*
*/
Comparator<Users> usersComparator2 = Comparator.comparing(Users::getAge, Comparator.reverseOrder()).thenComparing(Users::getId,Comparator.reverseOrder());
List<Users> collect2 = users.stream().sorted(usersComparator2).collect(Collectors.toList());
collect2.forEach(item -> {
System.out.println(item);
});
}
結果:
image.png