前言
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()));
结果:
蒙多
亚拉索
易