JAVA8List去重方法

更新时间:2023-07-11 19:58:53 阅读: 评论:0

JAVA8List去重⽅法
⼏种列表去重的⽅法
在这⾥我来分享⼏种列表去重的⽅法,算是⼀次整理吧,如有纰漏,请不吝赐教。
1. Stream 的distinct()⽅法
distinct()是Java 8 中 Stream 提供的⽅法,返回的是由该流中不同元素组成的流。distinct()使⽤hashCode()和eqauls()⽅法来获取不同的元素。因此,需要去重的类必须实现hashCode()和equals()⽅法。换句话讲,我们可以通过重写定制的hashCode()和equals()⽅法来达到某些特殊需求的去重。
distinct()⽅法声明如下:
1.
Stream<T> distinct();
2.
复制代码
1.1 对于String列表的去重
因为String类已经覆写了equals()和hashCode()⽅法,所以可以去重成功。
1.
@Test
2.
public void listDistinctByStreamDistinct() {
3.
// 1. 对于 String 列表去重
4.
List<String> stringList = new ArrayList<String>() {{
5.
add("A");
6.情侣句子
足球英语add("A");
7.
add("B");
8.
add("B");
9.
add("C");
10.
}};
11.
out.print("去重前:");
12.
for (String s : stringList) {
13.
out.print(s);
14.
}
15.
out.println();
16.
stringList = stringList.stream().distinct().List());
17.
语字开头的成语out.print("去重后:");
18.
for (String s : stringList) {
19.
out.print(s);
20.
}
周计划表格21.
out.println();
22.
}
23.
复制代码
结果如下:
1.
去重前:AABBC
2.
去重后:ABC
3.
复制代码
1.2 对于实体类列表的去重
注:代码中我们使⽤了Lombok插件的@Data注解,可⾃动覆写equals()以及hashCode()⽅法。
1.
/**
2.
* 定义⼀个实体类
3.
*/
4.
@Data
5.
public class Student {
6.
private String stuNo;
7.
private String name;
8.
}
9.
复制代码
1.
@Test
2.
public void listDistinctByStreamDistinct() throws JsonProcessingException {
3.
ObjectMapper objectMapper = new ObjectMapper();
4.
// 1. 对于 Student 列表去重
5.
List<Student> studentList = getStudentList();
6.
out.print("去重前:");
7.
out.println(objectMapper.writeValueAsString(studentList));
8.
生意英文
studentList = studentList.stream().distinct().List());
9.
out.print("去重后:");
10.
out.println(objectMapper.writeValueAsString(studentList));
11.
}
12.
复制代码
结果如下:
1.
去重前:[{"stuNo":"001","name":"Tom"},{"stuNo":"002","name":"Mike"},{"stuNo":"001","name":"Tom"}] 2.
去重后:[{"stuNo":"001","name":"Tom"},{"stuNo":"002","name":"Mike"}]
3.
绵阳是几线城市复制代码
2. 根据List<Object>中Object某个属性去重
2.1 新建⼀个列表出来
1.
@Test
2.
public void distinctByProperty1() throws JsonProcessingException {
3.
// 这⾥第⼀种⽅法我们通过新创建⼀个只有不同元素列表来实现根据对象某个属性去重
4.
ObjectMapper objectMapper = new ObjectMapper();
5.
List<Student> studentList = getStudentList();
6.
7.
out.print("去重前 :");
8.
out.println(objectMapper.writeValueAsString(studentList));
9.
studentList = studentList.stream().distinct().List());
10.
out.print("distinct去重后:");
11.
out.println(objectMapper.writeValueAsString(studentList));
12.
// 这⾥我们引⼊了两个静态⽅法,以及通过 TreeSet<> 来达到获取不同元素的效果
13.
// 1. import static java.util.llectingAndThen;
14.
// 2. import static java.util.Collection;
15.
studentList = studentList.stream().collect(
16.
collectingAndThen(
17.
toCollection(() -> new TreeSet<>(paring(Student::getName))), ArrayList::new)
18.
);
19.
out.print("根据名字去重后 :");
20.
out.println(objectMapper.writeValueAsString(studentList));
21.
}
22.
复制代码
结果如下:
1.
去重前 :[{"stuNo":"001","name":"Tom"},{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
2.
distinct去重后:[{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
3.
根据名字去重后 :[{"stuNo":"001","name":"Tom"}]
4.
复制代码
2.2 通过filter()⽅法
我们⾸先创建⼀个⽅法作为Stream.filter()的参数,其返回类型为Predicate,原理就是判断⼀个元素能否加⼊到Set中去,代码如下:1.
private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
2.
Set<Object> en = wKeySet();
3.
return t -> en.add(keyExtractor.apply(t));
4.
胆固醇高怎么办}
5.
复制代码
使⽤如下:
1.
@Test
2.
public void distinctByProperty2() throws JsonProcessingException {
3.
/
/ 这⾥第⼆种⽅法我们通过过滤来实现根据对象某个属性去重
4.
ObjectMapper objectMapper = new ObjectMapper();
5.
List<Student> studentList = getStudentList();
6.
7.
out.print("去重前 :");
8.
out.println(objectMapper.writeValueAsString(studentList));火拼俄罗斯
9.
studentList = studentList.stream().distinct().List());
10.
out.print("distinct去重后:");
11.
out.println(objectMapper.writeValueAsString(studentList));
12.
// 这⾥我们将 distinctByKey() ⽅法作为 filter() 的参数,过滤掉那些不能加⼊到 t 的元素
13.
studentList = studentList.stream().filter(distinctByKey(Student::getName)).List());
14.
out.print("根据名字去重后 :");
15.
out.println(objectMapper.writeValueAsString(studentList));
16.
}
17.
复制代码
结果如下:
1.
去重前 :[{"stuNo":"001","name":"Tom"},{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}] 2.
distinct去重后:[{"stuNo":"001","name":"Tom"},{"stuNo":"003","name":"Tom"}]
3.
根据名字去重后 :[{"stuNo":"001","name":"Tom"}]

本文发布于:2023-07-11 19:58:53,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1091300.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:元素   列表   实现   复制   对象   代码   获取   过滤
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图