Lambda表达式对List集合对象属性进行去重

1.选用Lambda表达简洁,运行效率更高,其实还是利用了map的特性进行去重
2.distinctByKey()方法,讲解下这个方法里的参数内容
(1)首先是Predicate这个返回参数,传入参数,返回true/false,(可以翻看源码看下
(2)对于Lambda表达式来说 filter会过滤为false的值,而参数Function是用来代替所传参数(可以翻看源码)
(3)创建一个ConcurrentHashMap,是由于流的读取是基于并发的,这个map集合在基于线程安全的情况下,并发效率更高
(4)
putIfAbsent()使用了map源码中的方法,大意是 当键不存在时,把参数放入map中,并返回null,如果键存在,则返回false,
  所以当键存不存在时为null,null==null为true,当键存在时,则返回false,这样就做到了 相同数据的筛选
  putIfAbsent 源码如下:
    

 

 

 

public static void main(String[] args) {
Person person1=new Person("1","张三","18","永远18");
Person person2=new Person("1","张三","18","永远18");
Person person3=new Person("1","张三","20","永远18");
Person person4=new Person("1","张三","19","永远18");
Person person5=new Person("1","张三","21","永远18");
Person person6=new Person("1","张三","18","永远18");
List<Person> personList=new ArrayList<>();
personList.add(person1);
personList.add(person2);
personList.add(person3);
personList.add(person4);
personList.add(person5);
personList.add(person6);
List<Person> list=personList.stream().filter(distinctByKey(person -> person.getAge())).collect(Collectors.toList());
list.forEach(person -> System.out.println(person));

}
private static <T> Predicate<T> distinctByKey(Function<? super T,?> keyExtractor){
Map<Object,Boolean> map=new ConcurrentHashMap<>();
return t -> map.putIfAbsent(keyExtractor.apply(t),Boolean.TRUE)==null;
}
运行结果:
  

 

 

 
posted @ 2021-10-26 21:40  勤奋的小蜜蜂1号  阅读(5687)  评论(0编辑  收藏  举报