java中List<对象>如何根据对象的一个属性进行去重
作者:一只小念
1.如果你想根据对象的一个属性进行去重,可以使用Java 8中的Stream API。
具体步骤如下:
1.实现一个自定义函数,该函数将用于确定两个对象是否相等,例如:
public static <T> Predicate<T> distinctByProperty(Function<? super T, Object> keyExtractor) { Map<Object, Boolean> map = new ConcurrentHashMap<>(); return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null; }
这个函数接受一个Function对象作为参数,该函数将从对象中提取唯一标识属性,并使用ConcurrentHashMap来确定是否已经处理过该属性值。
2.现在你可以使用这个函数来进行去重了,例如:
List<MyObject> myList = ... // Your list of objects List<MyObject> distinctList = myList.stream().filter(distinctByProperty(MyObject::getSomeProperty)).collect(Collectors.toList());
这个代码将对myList进行去重,只保留唯一的对象(即,他们的某个属性相同)。其中,getSomeProperty是MyObject类中的一个方法,它返回用于去重的属性
2.一行代码完成
ArrayList<BasicSectionCfg>list1=list.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(()->newTreeSet<>(Comparator.comparing(BasicSectionCfg::getPamKey))),ArrayList::new));
这段代码使用Java 8中的流API将一个ArrayList<BasicSectionCfg>进行去重并转换成另一个ArrayList。
具体来说,大致可以分为以下几步:
- 使用stream()方法将原始的ArrayList<BasicSectionCfg>转换成一个流Stream<BasicSectionCfg>。
- 使用collect()方法将流Stream<BasicSectionCfg>收集并转换成另一个集合。collect()方法接收一个Collector对象,并且Collectors类中提供了许多预定义的Collector实现,方便我们使用。在本段代码中,我们使用了Collectors.collectingAndThen()方法,它将一个Collector转换成另一个Collector,并在最后的结果上进行一些操作。
- 在Collectors.collectingAndThen()方法中,我们传递了两个参数:
第一个参数是Collectors.toCollection()方法,它创建了一个新的TreeSet集合,该集合使用Comparator.comparing()方法来对元素进行排序。其中Comparator.comparing()方法接收一个Function参数,该函数用于提取对象的某个属性,这里我们使用BasicSectionCfg::getPamKey方法来提取BasicSectionCfg对象的pamKey属性。
第二个参数是一个lambda表达式,它将TreeSet转换成ArrayList集合。具体地,它调用了ArrayList的构造函数,并将TreeSet作为参数传递给构造函数。
最终,这段代码的作用就是将list中的重复元素去重,并按照BasicSectionCfg对象的pamKey属性进行排序,得到一个新的ArrayList集合。
附:java list中根据对象多个属性去重方便快捷的方法
关键方法:
List<TestBean> distinctClass = list1.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection( () -> new TreeSet<>(Comparator.comparing( o -> o.getListName() + ";" + o.getName() + ";" + o.getXxName()))), ArrayList::new));
测试代码:
public static void main(String[] args) { TestBean testBean = new TestBean(); List<TestBean> list1 = new ArrayList<>(); testBean = new TestBean(); testBean.setName("3"); testBean.setListName("3"); testBean.setXxName("3"); list1.add(testBean); testBean = new TestBean(); testBean.setName("1"); testBean.setListName("1"); testBean.setXxName("1"); list1.add(testBean); testBean = new TestBean(); testBean.setName("2"); testBean.setListName("2"); testBean.setXxName("2"); list1.add(testBean); testBean = new TestBean(); testBean.setName("2"); testBean.setListName("2"); testBean.setXxName("2"); list1.add(testBean); System.out.println("原list大小:" + list1.size()); List<TestBean> distinctClass = list1.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getListName() + ";" + o.getName() + ";" + o.getXxName()))), ArrayList::new)); System.out.println("去重后的list大小:" + distinctClass.size()); }
输出结果如下:
原list大小:4
去重后的list大小:3
总结
到此这篇关于java中List<对象>如何根据对象的一个属性进行去重的文章就介绍到这了,更多相关java List<对象>去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!