Java8-Lambda实现条件去重List,如何实现条件分组groupByList 去重
Java8 lambda⾃带的去重为 distinct ⽅法, 但是只能过滤整体对象和基本数据类型, 不能实现对象⾥的某个值进⾏判定去重, ⽐如:
List<Integer> numbers = Arrays.asList(8,2,8,2,6,5,9,5,6,7);
List<Integer> distinctNumbers = numbers.stream()
.distinct()
.List());
System.out.println(distinctNumbers);
但是, 如果对⼀个实体对象List , 对指定的Student的某个字段作为条件去重就不⾏了,例如name字段。
如果你这么写:
List<Student> distinctUsers = users.stream()
.distinct(Student::getName)
.List());
这样是达不到效果的。
我们应该⾃定义个过滤器,然后调⽤这个过滤器进⾏去重。
过滤器:
public static<T> Predicate<T>distinct(Function<?super T, Object> keyExtractor){
Map<Object, Boolean> seen =new ConcurrentHashMap<>();
return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE)==null;
}
进⾏去重:
List<Student> students=new LinkedList<>();
students.add(new Student("man"));
students.add(new Student("man"));
students.add(new Student("man"));
students.add(new Student("liu"));
List<Student> distinctstudents = students.stream()
.filter(distinct(Student::getName))
.List());
System.out.println(distinctUsers);//[man, liu]
这样就能达到想要的效果了。
条件分组
5
6
7
8
9
10
11
12
13
groupby分组14
15
16
17
18
19
20
21
22
23
List<User> users =new LinkedList<>();
users.add(new User("Jim",12));
users.add(new User("John",18));
users.add(new User("Tom",21));
users.add(new User("Leo",30));
users.add(new User("Kate",44));
users.add(new User("Lio",50));
Map<String, List<User>> tripleUsers = users.stream()
.upingBy((Function<User, String>) user ->{ String key;
Age()<=20){
key ="less20";
}else Age()<=40){
key ="less40";
}else{
key ="more40";
}
return key;
}, List()));
System.out.println(tripleUsers);
//{more40=[Kate, Lio], less40=[Tom, Leo], less20=[Jim, John]}
技术交流,欢迎⼤佬和java学习者加⼊扣扣:344635699
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论