在学习本篇之前,最好对java8新特性有一定的了解。可以参考:Java8新特性--流(Stream)

场景:有一个实体的List集合,需要根据实体中的某个字段对List去重

要想去重,可以考虑使用TreeSet。先来看看TreeSet的用法:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Dish { private String id; private String name; }
   private static List<Dish> dishList = new ArrayList<Dish>();

    static {
Dish dish1 = new Dish("", "张三");
dishList.add(dish1);
Dish dish2 = new Dish("", "李四");
dishList.add(dish2);
Dish dish3 = new Dish("", "王五");
dishList.add(dish3);
}
    /**
* 测试TreeSet默认比较器及传入比较器
*/
@Test
public void testTreeSet() {
// TreeSet不传比较器,则默认按照自然顺序排序
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add();
treeSet.add();
treeSet.add();
System.out.println(treeSet);
// [1, 3, 4] // TreeSet中的元素,如果是实体,必须得传比较器(或者实体类需要实现Comparable中的compareTo方法),不然就会报错
// TreeSet是Set的子类,里面的元素有序且不能重复,可以去重
TreeSet<Dish> treeSet2 = new TreeSet<>(Comparator.comparing(Dish::getId));
treeSet2.addAll(dishList);
treeSet2.forEach(d -> System.out.println("id:" + d.getId() + ", name:" + d.getName()));
// id:001, name:张三
// id:002, name:王五
}

从上面可以看到TreeSet可以根据实体中的某个字段(这里是id)排序后去重。如果再将TreeSet转为List就可以达到我们的目的:

     List<Dish> newDishList = new ArrayList<>(treeSet2);
newDishList.forEach(d -> System.out.println("id:" + d.getId() + ", name:" + d.getName()));
// id:001, name:张三
// id:002, name:王五

虽然大功告成,但是写这么一堆代码,好麻烦。可以使用java8中的收集器简化一下:

  /**
* 测试Collectors.toCollection方法:将结果收集到其它类型的集合中(这里是TreeSet)
*/
@Test
public void testToCollection() {
TreeSet<Dish> treeSet2 = dishList.stream()
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Dish::getId))));
List<Dish> newDishList = new ArrayList<>(treeSet2);
newDishList.forEach(d -> System.out.println("id:" + d.getId() + ", name:" + d.getName()));
// id:001, name:张三
// id:002, name:王五
}

还可以再简单一点:

  /**
* 测试Collectors.collectingAndThen方法:将流中的数据通过Collector计算,计算的结果再通过Function处理一下
* (这里是将TreeSet转为ArrayList。即相当于将最终结果又经过了new ArrayList<>(treeSet))
*/
@SuppressWarnings("unchecked")
@Test
public void testCollectingAndThen() {
List<Dish> newDishList = dishList.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(Dish::getId))), ArrayList::new));
newDishList.forEach(d -> System.out.println("id:" + d.getId() + ", name:" + d.getName()));
// id:001, name:张三
// id:002, name:王五
}

  

用Collectors对List去重的更多相关文章

  1. Java 8 新特性 用 Collectors 对 List 去重

    场景:有一个实体的List集合,需要根据实体中的某个字段对List去重 Collectors.collectingAndThen方法:将流中的数据通过Collector计算,计算的结果再通过Funct ...

  2. list去重jdk1.8

    List<Object> newList = ll.stream().distinct().collect(Collectors.toList()); //jdk8去重操作

  3. java8--List转为Map、分组、过滤、求和等操作----代码示例

    Java 8 函数式编程风格 Java 迄今为止最令人激动的特征.这些新的语言特征允许采用函数式风格来进行编码,我们可以用这些特性完成许多有趣的功能.这些特性如此有趣以至于被认为是不合理的.他们说会影 ...

  4. 关于java8(Stream)的一些用法

    如果要处理int[] 转换成 List<Integer>这种形式的,可以用下面这个方法: List<Integer> orgIds = Arrays.stream(reqVo. ...

  5. Java8新特性(二)——强大的Stream API

    一.强大的Stream API 除了Lambda表达式外,Java8另外一项重大更新便是位于java.util.stream.*下的Stream API Stream 是 Java8 中处理集合的关键 ...

  6. JDK1.8--体验Stream表达式,从一个对象集合中获取每一个对象的某一个值返回新集合

    xl_echo编辑整理,欢迎转载,转载请声明文章来源.更多IT.编程案例.资料请联系QQ:1280023003 百战不败,依不自称常胜,百败不颓,依能奋力前行.——这才是真正的堪称强大!! --- 开 ...

  7. lambda表达式的一些学习

    关于lambda表达式的一些学习,例举出来. 1.学生实体类 public class Student { private String name; private int age; public S ...

  8. Java8 stream用法-备忘录

    1. 如何使用匹配模式 List<String> strs = Arrays.asList("a", "a", "a", &qu ...

  9. JDK新特性——Stream代码简洁之道的详细用法

    一.概述 Stream 是一组用来处理数组.集合的API,Stream API 提供了一种高效且易于使用的处理数据的方式. Java 8 中之所以费这么大的功夫引入 函数式编程 ,原因有两个: 代码简 ...

随机推荐

  1. Windows核心编程:第4章 进程

    Github https://github.com/gongluck/Windows-Core-Program.git //第4章 进程.cpp: 定义应用程序的入口点. // #include &q ...

  2. ASP.NET Web API + Elasticsearch 6.x 快速做个全文搜索

    最近想做个全文搜索,设想用 ASP.NET Web API + Elasticsearch 6.x 来实现. 网上搜了下 Elasticsearch 的资料,大部分是讲 linux 平台下如何用 ja ...

  3. C# Argument 'picture' must be a picture that can be used as an Icon

    Scenario: 创建了一个WinForm的小程序,希望将它显示在任务栏,所以在工具栏中的“公共控件”里,拖入NotifyIcon控件—notifyIcon1,这个是程序运行任务栏右侧通知区域图标显 ...

  4. [C#]Dapper学习笔记

    1.安装,直接用nuget搜索Dapper就行,不过只支持框架4.5.1 2.数据库测试表 CREATE TABLE [dbo].[Student]( [ID] [bigint] NULL, ) NU ...

  5. 友链&&日记

    上面友链,下面日记 友人链 最喜欢galgameの加藤聚聚 初三一本&&\(ACG\)姿势比我还丰厚的yx巨巨 更喜欢galgame的shadowice czx ZigZag胖胖 文文 ...

  6. 09_python_初始函数

    一.定义 函数是对功能和动作的封装 def functionname( parameters ): "函数_文档字符串" function_suite return [expres ...

  7. Redis---SDS(简单动态字符串)

    Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类 ...

  8. 移动一根火柴使等式成立js版本

    <html><head><meta http-equiv="Content-Type" content="text/html; charse ...

  9. win下wamp虚拟主机配置

    第一步:在http://www.wampserver.com/网站上下载Wampserver,可以根据计算机的版本(32位或者64位)下载对应的版本 第二步,傻瓜式安装(直接点击下一步,下一步就好). ...

  10. VirtualBox下Ubuntu虚拟机共享文件夹、自动挂载相关配置

    VirtualBox Ubuntu 共享文件夹的自动挂载: 一些基本的操作步骤: 首先,我们想要实现VirtualBox虚拟机与windows系统之间的通信,我们必须也应该正确的安装虚拟机系统. 其次 ...