网站如何优化排名软件,汕头快速排名,网站搜索,杭州设计院作者简介#xff1a;大家好#xff0c;我是smart哥#xff0c;前中兴通讯、美团架构师#xff0c;现某互联网公司CTO 联系qq#xff1a;184480602#xff0c;加我进群#xff0c;大家一起学习#xff0c;一起进步#xff0c;一起对抗互联网寒冬 1. Stream 的 distinct…作者简介大家好我是smart哥前中兴通讯、美团架构师现某互联网公司CTO 联系qq184480602加我进群大家一起学习一起进步一起对抗互联网寒冬 1. Stream 的 distinct() 方法
distinct() 是Java 8 中 Stream 提供的方法返回的是由该流中不同元素组成的流distinct() 通过 hashCode() 和 eqauls() 方法来判断重复元素因此我们可以通过重写 hashCode() 和 equals() 方法来达到某些特殊需求的去重。
StreamT distinct();1.1 对于 String 列表的去重
因为 String 类已经覆写了 equals() 和 hashCode() 方法所以可以去重成功。
// 1. 对于 String 列表去重ListString stringList new ArrayListString() {{add(A);add(A);add(B);add(B);add(C);}};logger.info(去重前{}, stringList);stringList stringList.stream().distinct().collect(Collectors.toList());logger.info(去重后{}, stringList);结果如下 去重前AABBC
去重后ABC1.2 对于实体类列表的去重
注代码中我们使用了 Lombok 插件的 Data 注解可自动覆写 equals 和 hashCode 方法。
/**
* 定义一个实体类
*/
Data
public class Student {private String stuNo;private String name;
}// 1. 对于 Student 列表去重
ListStudent studentList getStudentList();
logger.info(去重前{}, JSON.toJSONString(studentList));
studentList studentList.stream().distinct().collect(Collectors.toList());
logger.info(去重后{}, JSON.toJSONString(studentList));结果如下
去重前[{stuNo:001,name:Tom},{stuNo:002,name:Mike},{stuNo:001,name:Tom}]
去重后[{stuNo:001,name:Tom},{stuNo:002,name:Mike}]2. 根据 ListObject 中 Object 某个属性去重
2.1 利用 TreeSet 通过 comparing 指定某个属性来去重
ListStudent studentList studentList.stream().collect(collectingAndThen(toCollection(() - new TreeSet(Comparator.comparing(Student::getName))), ArrayList::new));2.2 通过 filter() 方法
我们首先创建一个方法作为 Stream.filter() 的参数其返回类型为 Predicate原理就是判断一个元素能否加入到 Set 中去代码如下
private static T PredicateT distinctByKey(Function? super T, ? keyExtractor) {SetObject seen ConcurrentHashMap.newKeySet();return t - seen.add(keyExtractor.apply(t));
}使用如下
ListStudent studentList studentList.stream().filter(distinctByKey(Student::getName)).collect(Collectors.toList());作者简介大家好我是smart哥前中兴通讯、美团架构师现某互联网公司CTO 进群大家一起学习一起进步一起对抗互联网寒冬