java按照list集合中的对象属性进行去重
Posted 野生java研究僧
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java按照list集合中的对象属性进行去重相关的知识,希望对你有一定的参考价值。
文章目录
1.java按照list集合中的对象属性进行去重
有时候我们需要对List集合进行去重,但是去重的集合不是String,Integer等简单的数据类型,而是复杂的对象类型,并且是根据List集合中的对象的指定属性进行去重,我这里封装了一个方法,是根据jdk源码来的,不需要引入任何第三方依赖,无任何侵入性。非常的灵活,可以指定任意属性进行去重。
具体看代码:
public class DistinctListTest
public static void main(String[] args) throws Exception
User userInfo1 = new User("1", "admin");
User userInfo2 = new User("2", "root");
User userInfo4 = new User("3", "admin");
User userInfo3 = new User("4", "jack");
List<User> userInfoList = Arrays.asList(userInfo1, userInfo2, userInfo3, userInfo4);
System.out.println(distinctListForAttribute(userInfoList,"name"));
/**
* 根据对象属性名获取属性值
* @param target 目标对象
* @param filedName 属性名称
* @return java.lang.Object
* @date 2022/6/25 21:31
* @since 1.0.0
**/
public static Object getFieldValue(Object target, String filedName)
if (target == null || filedName == null || filedName.trim().length()<=0)
throw new ArithmeticException("target 或 filedName 不能为空!");
Class<?> clazz = target.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields)
field.setAccessible(true);
if (field.getName().equals(filedName))
try
return field.get(target);
catch (IllegalAccessException e)
e.printStackTrace();
throw new RuntimeException("根据对象属性名获取属性值发生错误:" + e.getMessage());
throw new RuntimeException("未能根据对象属性名获取属性值");
/**
* 对list集合中的元素按照属性进行去重,去重完毕后属性不发生变化
*
* @param userInfoList 需要去重的集合
* @return java.util.List<compass.city.service.demo.PatternTest.UserInfo>
* @date 2022/6/25 21:03
* @since 1.0.0
**/
public static <T extends Object > List<T> distinctListForAttribute(List<T> userInfoList,String filedName)
List<T> filteredList = new ArrayList<>();
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
try
userInfoList.stream()
.filter(item-> seen.putIfAbsent(getFieldValue(item,filedName), Boolean.TRUE) == null)
.forEach(filteredList::add);
seen.clear();
catch (Exception e)
e.printStackTrace();
throw new RuntimeException("根据属性名去重List集合中的对象发生异常:"+e.getMessage());
return filteredList;
static class User
@Override
public String toString()
return "User" +
"id='" + id + '\\'' +
", name='" + name + '\\'' +
'';
public User()
public User(String id, String name)
this.id = id;
this.name = name;
private String id;
private String name;
public String getId()
return id;
public void setId(String id)
this.id = id;
public String getName()
return name;
public void setName(String name)
this.name = name;
以上是关于java按照list集合中的对象属性进行去重的主要内容,如果未能解决你的问题,请参考以下文章
java对list集合进行去重 传统方式 VS Lambda