专业建站公司费用,地产网站模板,电商网站运营团队建设方案模板,怎么介绍自己做的网站背景
在Java开发过程中#xff0c;我们经常会遇到需要对List进行去重的需求。 其中常见的情况是#xff0c;将数组去重#xff0c;或者将对象依据某个字段去重。这两种方式均可用set属性进行处理。 今天讨论#xff0c;有一个List#xff0c;且其中的元素是自定义的对象我们经常会遇到需要对List进行去重的需求。 其中常见的情况是将数组去重或者将对象依据某个字段去重。这两种方式均可用set属性进行处理。 今天讨论有一个List且其中的元素是自定义的对象我们需要根据对象的某两个字段的值来进行去重并得到去重后的结果。
整理过程如下
方案一
1、基础准备
假设需要对人员User去重依据编号code和名称name去重
2、原始LIst
ListUser userList Arrays.asList(new User(1,张三), new User(2,李四), new User(2,李四), new User(2,李四));3、去重
使用Java 8的Stream API来实现去重
1、使用stream()方法将List转换成Stream。
2、使用distinct()方法去除重复的元素。
3、使用collect(Collectors.toList())将去重后的Stream转换成List。ListUser distinctList userList.stream().distinct().collect(Collectors.toList());4、查看去重后的数据
for (User user : distinctList) {System.out.println(编号 user.getCode() 名称 user.getName());
}5、代码如下
人员User.java
package com;public class User {private String code;private String name;public String getCode() {return code;}public void setCode(String code) {this.code code;}public String getName() {return name;}public void setName(String name) {this.name name;}public User() {}public User(String code, String name) {this.code code;this.name name;}Overridepublic boolean equals(Object obj) {if (this obj) {return true;}if (obj null || getClass() ! obj.getClass()) {return false;}User other (User) obj;return code.equals(other.code) name.equals(other.name);}Overridepublic int hashCode() {return Objects.hash(code, name);}}测试类Test .java
package com;import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {ListUser userList Arrays.asList(new User(1,张三), new User(2,李四), new User(2,李四), new User(2,李四));ListUser distinctList userList.stream().distinct().collect(Collectors.toList());for (User user : distinctList) {System.out.println(编号 user.getCode() 名称 user.getName());}}
}
6、打印结果 方案二
1、使用工具类处理
人员User.java
package com;import java.util.Objects;public class User {private String code;private String name;public String getCode() {return code;}public void setCode(String code) {this.code code;}public String getName() {return name;}public void setName(String name) {this.name name;}public User() {}public User(String code, String name) {this.code code;this.name name;}}测试类Test.java
package com;import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;public class Test {public static void main(String[] args) {ListUser userList Arrays.asList(new User(1,张三), new User(2,李四), new User(2,李四), new User(2,李四));ListUser distinctList removeDuplicateField(userList);for (User user : distinctList) {System.out.println(编号 user.getCode() 名称 user.getName());}}private static ListUser removeDuplicateField(ListUser list) {SetUser set new TreeSet(new ComparatorUser() {Overridepublic int compare(User o1, User o2) {int compareToResult 1;if(StringUtils.equals(o1.getCode(), o2.getCode()) StringUtils.equals(o1.getName(), o2.getName())) {compareToResult 0; // 0重复}return compareToResult;}});set.addAll(list);return new ArrayList(set);}
}
关键代码removeDuplicateField
2、结果 3、拓展
如上removeDuplicateField方法可将该方法通过反射修改成动态通用方法。 JAVA通过反射获取和设置Bean属性(总结)https://blog.csdn.net/qq_38254635/article/details/115520411
Java通过反射机制,动态设置对象属性值https://blog.csdn.net/qq_38254635/article/details/115765808 也就说说可将compare中的比较方法通过注解及反射的方式处理获取Field的注解根据固定注解进行比较处理这样可将removeDuplicateField完善成可配置方法。
弊端如果使用场景较多可采用配置的方式如情况单一从性能方面考虑建议单独建立比较方法。
参考链接
1、https://blog.51cto.com/u_16175434/7631997 2、https://code84.com/850204.html
如有不正确之处还望指正书写不易觉得有帮助就点个赞吧☺☺☺