<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
distinct()是Java 8 中 Stream 提供的方法,返回的是由該流中不同元素組成的流。distinct()使用 hashCode() 和 eqauls() 方法來獲取不同的元素。
因此,需要去重的類必須實現 hashCode() 和 equals() 方法。換句話講,我們可以通過重寫客製化的 hashCode() 和 equals() 方法來達到某些特殊需求的去重。
distinct() 方法宣告如下:
Stream<T> distinct();
因為 String 類已經覆寫了 equals() 和 hashCode() 方法,所以可以去重成功。
@Test public void listDistinctByStreamDistinct() { // 1. 對於 String 列表去重 List<String> stringList = new ArrayList<String>() {{ add("A"); add("A"); add("B"); add("B"); add("C"); }}; out.print("去重前:"); for (String s : stringList) { out.print(s); } out.println(); stringList = stringList.stream().distinct().collect(Collectors.toList()); out.print("去重後:"); for (String s : stringList) { out.print(s); } out.println(); }
結果如下:
去重前:AABBC
去重後:ABC
注:程式碼中我們使用了 Lombok 外掛的 @Data註解,可自動覆寫 equals() 以及 hashCode() 方法。
/** * 定義一個實體類 */ @Data public class Student { private String stuNo; private String name; }
@Test public void listDistinctByStreamDistinct() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); // 1. 對於 Student 列表去重 List<Student> studentList = getStudentList(); out.print("去重前:"); out.println(objectMapper.writeValueAsString(studentList)); studentList = studentList.stream().distinct().collect(Collectors.toList()); out.print("去重後:"); out.println(objectMapper.writeValueAsString(studentList)); }
結果如下:
去重前:[{"stuNo":"001","name":"Tom"},{"stuNo":"002","name":"Mike"},{"stuNo":"001","name":"Tom"}]
去重後:[{"stuNo":"001","name":"Tom"},{"stuNo":"002","name":"Mike"}]
@Test public void distinctByProperty1() throws JsonProcessingException { // 這裡第一種方法我們通過新建立一個只有不同元素列表來實現根據物件某個屬性去重 ObjectMapper objectMapper = new ObjectMapper(); List<Student> studentList = getStudentList(); out.print("去重前 :"); out.println(objectMapper.writeValueAsString(studentList)); studentList = studentList.stream().distinct().collect(Collectors.toList()); out.print("distinct去重後:"); out.println(objectMapper.writeValueAsString(studentList)); // 這裡我們引入了兩個靜態方法,以及通過 TreeSet<> 來達到獲取不同元素的效果 // 1. import static java.util.stream.Collectors.collectingAndThen; // 2. import static java.util.stream.Collectors.toCollection; studentList = studentList.stream().collect( collectingAndThen( toCollection(() -> new TreeSet<>(Comparator.comparing(Student::getName))), ArrayList::new) ); out.print("根據名字去重後 :"); out.println(objectMapper.writeValueAsString(studentList)); }
結果如下:
去重前 :[{"stuNo":"001","name":"Tom"},{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
distinct去重後:[{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
根據名字去重後 :[{"stuNo":"001","name":"Tom"}]
我們首先建立一個方法作為 Stream.filter() 的引數,其返回型別為 Predicate,原理就是判斷一個元素能否加入到 Set 中去,程式碼如下:
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); }
使用如下:
@Test public void distinctByProperty2() throws JsonProcessingException { // 這裡第二種方法我們通過過濾來實現根據物件某個屬性去重 ObjectMapper objectMapper = new ObjectMapper(); List<Student> studentList = getStudentList(); out.print("去重前 :"); out.println(objectMapper.writeValueAsString(studentList)); studentList = studentList.stream().distinct().collect(Collectors.toList()); out.print("distinct去重後:"); out.println(objectMapper.writeValueAsString(studentList)); // 這裡我們將 distinctByKey() 方法作為 filter() 的引數,過濾掉那些不能加入到 set 的元素 studentList = studentList.stream().filter(distinctByKey(Student::getName)).collect(Collectors.toList()); out.print("根據名字去重後 :"); out.println(objectMapper.writeValueAsString(studentList)); }
結果如下:
去重前 :[{"stuNo":"001","name":"Tom"},{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
distinct去重後:[{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
根據名字去重後 :[{"stuNo":"001","name":"Tom"}]
到此這篇關於Java8利用Stream實現列表去重的方法詳解的文章就介紹到這了,更多相關Java8 列表去重內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45