栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

合并Java 8中的两个对象列表

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

合并Java 8中的两个对象列表

如果要实现

equals
and
hashCode
,则 内部 进行操作
Parent
。在该类中添加类似的方法

    @Override    public int hashCode() {        return Objects.hash(getAttrib1(), getAttrib2(), getAttrib3(), // …      getAttrib19(), getAttrib20());    }    @Override    public boolean equals(Object obj) {        if(this==obj) return true;        if(!(obj instanceof Parent)) return false;        Parent p=(Parent) obj;        return Objects.equals(getAttrib1(), p.getAttrib1()) && Objects.equals(getAttrib2(), p.getAttrib2()) && Objects.equals(getAttrib3(), p.getAttrib3()) // … && Objects.equals(getAttrib19(), p.getAttrib19()) && Objects.equals(getAttrib20(), p.getAttrib20());    }

如果您这样做了,

distinct()
在上调用
Stream<Parent>
将自动执行正确的操作。


如果您不想(或无法)更改类

Parent
,则没有平等的委托机制,但是您可以求助于 排序, 因为它具有委托机制:

Comparator<Parent> c=Comparator.comparing(Parent::getAttrib1)        .thenComparing(Parent::getAttrib2)        .thenComparing(Parent::getAttrib3)        // …        .thenComparing(Parent::getAttrib19)        .thenComparing(Parent::getAttrib20);

这将基于属性定义顺序。它要求属性本身的类型是可比较的。如果你有这样的定义,你可以用它来实现的等效

distinct()
,基于这样
Comparator

List<Parent> result = Stream.concat(list1.stream(), list2.stream())        .filter(new TreeSet<>(c)::add)        .collect(Collectors.toList());

如果您想将其与并行流一起使用,则还有一个线程安全的变体:

List<Parent> result = Stream.concat(list1.stream(), list2.stream())        .filter(new ConcurrentSkipListSet<>(c)::add)        .collect(Collectors.toList());


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454288.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号