Stream流之distinct去重详细用法

前言

distinct方法在Stream流中可以进行集合中的去重操作,但是要按照集合中的数据类型具体来定义。简单数据类型和自定义数据类型操作不同。

简单数据类型

这里以List集合为例,并且集合中数据类型为Integer。简单数据类型直接调用Stream中的distinct方法即可进行去重,会比较每个值,若两个值相同则认为重复,则会去重。

List<Integer> list = new ArrayList<>(Arrays.asList(1,2,3,4,4,5));
list.stream()
        .distinct()
        .forEach(a -> System.out.println(a));

结果:

1
2
3
4
5

其他的简单数据类型也类似,这里不做演示。

自定义数据类型

集合中的数据类型是自定义的对象的话,则distinct去重的时候,会根据自定义对象中的equals的方法,来进行判重,所以我们要重写对象中的equals方法才行,自定义对象Author如下:

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode//用于后期的去重使用(相当于重写了equals方法,自定义Author对象查重比较),此处自定义的比较是:全部元素相同即对象相同
public class Author {
    
    
    //id
    private Long id;
    //姓名
    private String name;
    //年龄
    private Integer age;
    //简介
    private String intro;
    //作品
    private List<Book> books;

}

我们使用lombok@EqualsAndHashCode注解,相当于重写了equals方法,该方法默认为:如果两个对象中的所有元素都想同,则会认为重复,则去重。

如果我们不想判断所有元素都相同的时候才认为重复,我们可以自己重写equals方法,在IDEA中,alt + enter,选择如图中按钮即可:
在这里插入图片描述
一路next下去,在下图中的时候,选择想要判断对象重复的相同字段:
在这里插入图片描述

此时,只有当两个对象的这四个字段都相同时,才会认为这两个对象相同,最后重写的equals方法(会多一个hashCode方法,此方法不能去掉)如图:
在这里插入图片描述

然后我们就可以使用distinct进行对象去重了。

Author author = new Author(1L, "蒙多", 33, "一个从菜刀中明悟哲理的祖安人", null);
Author author2 = new Author(2L, "亚拉索", 15, "狂风也追逐不上他的思考速度", null);
Author author3 = new Author(3L, "易", 14, "是这个世界在限制他的思维", null);
Author author4 = new Author(3L, "易", 15, "是这个世界在限制他的思维", null);

List<Author> authors = getAuthors();
authors.stream()
        .distinct()
        .forEach(author -> System.out.println(author.getName()));

结果:

蒙多
亚拉索
易

猜你喜欢

转载自blog.csdn.net/qq_47188967/article/details/131975702