Java 8 Stream.distinct() 示例

在这篇文章里,我们将提供Java8 Stream distinct()示例。 distinct()返回由该流的不同元素组成的流。distinct()是Stream接口的方法。distinct()使用hashCode()和equals()方法来获取不同的元素。因此,我们的类必须实现hashCode()和equals()方法。如果distinct()正在处理有序流,那么对于重复元素,将保留以遭遇顺序首先出现的元素,并且以这种方式选择不同元素是稳定的。在无序流的情况下,不同元素的选择不一定是稳定的,是可以改变的。distinct()执行有状态的中间操作。在有序流的并行流的情况下,保持distinct()的稳定性是需要很高的代价的,因为它需要大量的缓冲开销。如果我们不需要保持遭遇顺序的一致性,那么我们应该可以使用通过BaseStream.unordered()方法实现的无序流。
1. Stream.distinct()

distinct()方法的声明如下:

Stream<T> distinct()

它是Stream接口的方法。在此示例中,我们有一个包含重复元素的字符串数据类型列表

DistinctSimpleDemo.javapackage com.concretepage;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class DistinctSimpleDemo {public static void main(String[] args) {List<String> list = Arrays.asList("AA", "BB", "CC", "BB", "CC", "AA", "AA");long l = list.stream().distinct().count();System.out.println("No. of distinct elements:"+l);String output = list.stream().distinct().collect(Collectors.joining(","));System.out.println(output);}
}
Output
No. of distinct elements:3
AA,BB,CC
2. Stream.distinct() with List of Objects
在此示例中,我们有一个Book对象列表。 为了对列表进行去重,该类将重写hashCode()和equals()。Book.javapackage com.concretepage;
public class Book {private String name;private int price;public Book(String name, int price) {this.name = name;this.price = price;}public String getName() {return name;}public int getPrice() {return price;}@Overridepublic boolean equals(final Object obj) {if (obj == null) {return false;}final Book book = (Book) obj;if (this == book) {return true;} else {return (this.name.equals(book.name) && this.price == book.price);}}@Overridepublic int hashCode() {int hashno = 7;hashno = 13 * hashno + (name == null ? 0 : name.hashCode());return hashno;}
}
DistinctWithUserObjects.java
package com.concretepage;
import java.util.ArrayList;
import java.util.List;
public class DistinctWithUserObjects {public static void main(String[] args) {List<Book> list = new ArrayList<>();{list.add(new Book("Core Java", 200));list.add(new Book("Core Java", 200));list.add(new Book("Learning Freemarker", 150));         list.add(new Book("Spring MVC", 300));list.add(new Book("Spring MVC", 300));}long l = list.stream().distinct().count();System.out.println("No. of distinct books:"+l);list.stream().distinct().forEach(b -> System.out.println(b.getName()+ "," + b.getPrice()));}
}

Output

No. of distinct books:3
Core Java,200
Learning Freemarker,150
Spring MVC,300
3. Distinct by Property
distinct()不提供按照属性对对象列表进行去重的直接实现。它是基于hashCode()和equals()工作的。如果我们想要按照对象的属性,对对象列表进行去重,我们可以通过其它方法来实现。如下代码段所示:

static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {Map<Object,Boolean> seen = new ConcurrentHashMap<>();return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

上面的方法可以被Stream接口的 filter()接收为参数,如下所示:

list.stream().filter(distinctByKey(b -> b.getName()));
distinctByKey()方法返回一个使用ConcurrentHashMap 来维护先前所见状态的 Predicate 实例,如下是一个完整的使用对象属性来进行去重的示例。

DistinctByProperty.javapackage com.concretepage;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
public class DistinctByProperty {public static void main(String[] args) {List<Book> list = new ArrayList<>();{list.add(new Book("Core Java", 200));list.add(new Book("Core Java", 300));list.add(new Book("Learning Freemarker", 150));list.add(new Book("Spring MVC", 200));list.add(new Book("Hibernate", 300));}list.stream().filter(distinctByKey(b -> b.getName())).forEach(b -> System.out.println(b.getName()+ "," + b.getPrice()));   }private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {Map<Object,Boolean> seen = new ConcurrentHashMap<>();return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;}
}

Output

Core Java,200
Learning Freemarker,150
Spring MVC,200
Hibernate,300

Java 8 Stream.distinct() 列表去重示例相关推荐

  1. 通过stream去重_Java 8 Stream.distinct() 列表去重的操作

    在这篇文章里,我们将提供Java8 Stream distinct()示例. distinct()返回由该流的不同元素组成的流.distinct()是Stream接口的方法. distinct()使用 ...

  2. list.stream distinct列表去重

    //去重后数量 long count= ObjectList.stream() .distinct() .count(); //集合对象去重 List<Object> result= Ob ...

  3. stream distinct去重_再来看看Java的新特性——Stream流

    半年前开始试着使用Java的新特性,给我印象最深的就是Stream流和Optional.其中Stream提高了看法效率,让代码看起来十分清爽. 为什么要使用流? 摘要中已经说明了,为了提高开发效率.流 ...

  4. java.util.stream.Stream详解

    Stream(流)是一个支持顺序和平行聚合操作的元素序列,和java.util.List类似,是jdk1.8的新特性.可以看出Stream还有几个兄弟类IntStream.LongStream和Dou ...

  5. jdk8 List集合 Stream distinct() 去重代码示例

    Requirements: 去重List内重复对象(此处重复定义与对象属性值有关) Achievement: List Stream 对象调用distinct()方法,distinct()方法依赖ha ...

  6. java表数据去重_java8实现列表去重,java8的stream 和lambda的使用实例

    不管我们做安卓开发还是javaweb开发,有时候我们会对列表进行去重操作,所谓的列表数据重复,通常体现在列表集合数据中的id属性相同.当然我们通过普通的方式也可以达到去重的效果.但是借助java8新特 ...

  7. Java 8 Stream中间操作(方法)示例

    Java 8 Streams中间操作的完整指南. 所有内置Stream API中间操作(方法)的列表以及示例. 1.概述 在本教程中,我们将学习什么是 Java 8 Stream 中的中间操作 . 所 ...

  8. Java8 中通过 Stream 对列表进行去重的几种方法

    点击关注公众号,实用技术文章及时了解 来源:juejin.cn/post/6844903842132262926 在这里我来分享几种列表去重的方法,算是一次整理吧,如有纰漏,请不吝赐教. 1. Str ...

  9. 通过stream去重_分享几种 Java8 中通过 Stream 对列表进行去重的方法

    几种列表去重的方法 在这里我来分享几种列表去重的方法,算是一次整理吧,如有纰漏,请不吝赐教.1. Stream 的distinct()方法 distinct()是Java8中 Stream 提供的方法 ...

最新文章

  1. Kotlin中var和val的区别
  2. 2021操作系统知识结构图
  3. mobaxterm 传文件夹_如何使用MobaXterm上传文件到远程Linux系统-MobaXterm使用教程
  4. 遇到的问题锦集及解决方案
  5. 三维重建9:点云图像的滤波方法小结
  6. 计算机网络又称为分时多用户,7计算机网络原理期末复习试卷A卷.doc
  7. php如何上传文件,PHP上传文件
  8. 某大型银行深化系统之十七:性能设计之二
  9. cplex求解整数规划_Ortools调用第三方求解器
  10. php array函数 strpos strstr查找一个字符串是否在另外一个字符串中
  11. 教育平台在线,教育平台源码 类似eduline教育平台系统源码下载
  12. Unity 创建fnt字体
  13. Lower power design UPF 学习
  14. VS2019的C++项目如何查看源文件(.h,.cc.cpp等)所在的工程
  15. PS修改电子版证件背景色
  16. 微商怎么找客源,新手做微商如何找客源的
  17. WdatePicker常用配置属性
  18. TCP缓冲区大小及限制
  19. Android Studio学习开发笔记--基础
  20. 网贷害人,迷途知返后,天真的以为外包只要会增删改查就够了???

热门文章

  1. 中柏平板触摸驱动_要成绩也要玩乐,聊聊学生买平板那些事儿
  2. 我坚决不能容忍_出轨坚决不能忍,3星座女对出轨0容忍,敢出轨就等着吧
  3. [六省联考2017]相逢是问候(线段树+拓展欧拉定理)
  4. MyBatis学习总结_03_优化MyBatis配置文件中的配置
  5. 网游中的网络编程系列1:UDP vs. TCP
  6. 文件转为十六进制文本
  7. Windows安装CUDAcuDNNanaconda
  8. Android5.1权限问题解决
  9. jni数组使用(二)
  10. iOS 后台运行实现总结