Java流合并或减少重复对象

2024-04-23

我需要通过将所有重复条目合并到一个对象中来从可以具有重复项的列表中生成一个唯一的朋友列表
Example- 从不同的社交源中获取好友并放入 1 个大列表中
1. 朋友 - [姓名:“约翰尼·德普”,出生日期:“1970-11-10”,来源:“FB”,fbAttribute:“..”]
2. 朋友 - [姓名:“克里斯蒂安·贝尔”,出生日期:“1970-01-01”,来源:“LI”,li属性:“..”]
3. 朋友 - [姓名:“约翰尼·德普”,出生日期:“1970-11-10”,来源:“Twitter”,twitterAttribute:“..”]
4. 朋友 - [姓名:“约翰尼·德普”,出生日期:“1970-11-10”,来源:“LinkedIn”,liAttribute:“..”]
5. 朋友 - [姓名:“克里斯蒂安·贝尔”,出生日期:“1970-01-01”,来源:“LI”,li属性:“..”]

预期产出
1. 朋友 - [姓名:“克里斯蒂安·贝尔”,出生日期:“1970-01-01”,liAttribute:“..”,fbAttribute:“..”,twitterAttribute:“..”]
2. 朋友 - [姓名:“约翰尼·德普”,出生日期:“1970-11-10”,liAttribute:“..”,fbAttribute:“..”,twitterAttribute:“..”]

Question- 如何在不使用任何中间容器的情况下合并?我可以轻松地使用中间映射并对条目的每个值应用减少。

List<Friend> friends;
Map<String, List<Friend>> uniqueFriendMap
    = friends.stream().groupingBy(Friend::uniqueFunction);
List<Friend> mergedFriends = uniqueFriendMap.entrySet()
    .stream()
    .map(entry -> {
           return entry.getValue()
                .stream()
                .reduce((a,b) -> friendMergeFunction(a,b));
    })
    .filter(mergedPlace -> mergedPlace.isPresent())
    .collect(Collectors.toList());

我喜欢在不使用中间 Map uniqueFriendMap 的情况下执行此操作。有什么建议么?


The groupingBy操作(或类似的事情)是不可避免的,Map由该操作创建的还在操作期间用于查找分组键和查找重复项。但你可以将它与群元素的减少结合起来:

Map<String, Friend> uniqueFriendMap = friends.stream()
    .collect(Collectors.groupingBy(Friend::uniqueFunction,
        Collectors.collectingAndThen(
            Collectors.reducing((a,b) -> friendMergeFunction(a,b)), Optional::get)));

地图的值已经是不同朋友的结果。如果你真的需要一个List,您可以使用简单的 Collection 操作来创建它:

List<Friend> mergedFriends = new ArrayList<>(uniqueFriendMap.values());

如果第二个操作仍然让您烦恼,您可以将其隐藏在collect手术:

List<Friend> mergedFriends = friends.stream()
    .collect(Collectors.collectingAndThen(
        Collectors.groupingBy(Friend::uniqueFunction, Collectors.collectingAndThen(
            Collectors.reducing((a,b) -> friendMergeFunction(a,b)), Optional::get)),
        m -> new ArrayList<>(m.values())));

由于嵌套收集器代表了一个归约(另请参见这个答案 https://stackoverflow.com/a/57042622/2711488), 我们可以用toMap反而:

List<Friend> mergedFriends = friends.stream()
    .collect(Collectors.collectingAndThen(
        Collectors.toMap(Friend::uniqueFunction, Function.identity(),
            (a,b) -> friendMergeFunction(a,b)),
        m -> new ArrayList<>(m.values())));

取决于是否friendMergeFunction is a static方法或实例方法,您可以替换(a,b) -> friendMergeFunction(a,b) with DeclaringClass::friendMergeFunction or this::friendMergeFunction.


但请注意,即使在您最初的方法中,也可以进行一些简化。当您只处理 a 的值时Map,您不需要使用entrySet(),这需要你打电话getValue()在每个条目上。您可以处理values()首先。那么,你就不需要冗长的input -> { return expression; }语法,如input -> expression足够了。由于前面的分组操作的组不能为空,所以过滤步骤就被废弃了。所以你原来的方法看起来像:

Map<String, List<Friend>> uniqueFriendMap
    = friends.stream().collect(Collectors.groupingBy(Friend::uniqueFunction));
List<Friend> mergedFriends = uniqueFriendMap.values().stream()
    .map(group -> group.stream().reduce((a,b) -> friendMergeFunction(a,b)).get())
    .collect(Collectors.toList());

这还不错。如前所述,融合操作不会跳过Map创造是不可避免的。它只会跳过Lists 代表每个组,因为它将把它们减少为一个Friend到位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java流合并或减少重复对象 的相关文章

随机推荐

  • 如何使用linq动态过滤子集合

    我正在尝试过滤用户请求的结果 例如你有orders and order details and products是子集合 当用户想要按产品过滤时 我收到错误 因为No property or field PRODUCTS exists in
  • 如何在 FastAPI 中访问端点视图函数内的 APP 属性?

    这是我的项目结构 gitignore README md requirements txt start py app main py apis v1 init py routes evaluation essentials py train
  • python pandas 选择头部和尾部

    对于 Pandas 中的 DataFrame 如何同时选择前 5 个值和后 5 个值 例如 In 11 df Out 11 A B C 2012 11 29 0 0 0 2012 11 30 1 1 1 2012 12 01 2 2 2 2
  • 无法将“obj\Debug\{project}.dll”复制到“bin\{project}.dll”

    最近 当我尝试运行我的项目时 Web 版 Visual Studio Express 2013 经常抛出此错误 我找到的唯一解决方案是退出并重新启动 Visual Studio 或 有时 完全重新启动 Windows 什么会导致这样的事情
  • 加载时css3过渡动画?

    是否可以在页面加载时使用 CSS3 过渡动画而不使用 Javascript 这就是我想要的 但是在页面加载时 图像滑块 html https web archive org web 20141021062316 http rilwis go
  • Spring Boot x509 测试 - pcf

    In 云铸造厂我已对其进行配置 以便将客户端证书转发到我的 Spring Boot 应用程序 该证书被放置在x forwarded client certheader 中 spring boot 应用程序读取 this 并检查 CN 是否已
  • 如何在access中查看宏代码?

    我有一个 Microsoft Access 数据库 里面有一个宏 如何查看宏的代码 打开Access数据库 您将看到表 查询 报告 模块和宏 其中包含可用于按顺序调用常见 MS Access 操作的宏 对于自定义 VBA 宏 请按 ALT
  • Safari 在 div 中使用 Google 地图打破边框半径

    对我来说关于 Stack 的第一个问题 我已经完成了我的作业并发现了类似这个主题的内容 在 webkit 浏览器中 v3 谷歌地图不尊重容器的边框半径 有人有解决方法吗 https stackoverflow com questions 1
  • 查找API端点的方法

    API探索 尽管有几个问题涉及该主题 但我找不到解决我想要理解的核心概念的问题 如果知道 API 的根结构 我们可以想象一下http stackoverflow com api service 我们可以成功地从已知端点检索结果 比方说htt
  • 如何安全地销毁 QThread?

    我想正确地销毁一个QThread在 Qt 5 3 中 到目前为止我已经得到 MyClass MyClass QObject parent QObject parent mThread new QThread this QObject con
  • 获取 3 个列表之间的差异

    我正在研究列表的差异 gt gt a 1 2 3 gt gt b 2 4 5 gt gt c 3 2 6 两组之间的对称差异可以使用以下方法完成 gt gt z set a symmetric difference set b gt gt
  • 3D 空间中的激光投影仪校准

    我正在研究一种在现实世界中校准激光投影仪的解决方案 该项目有几个目标 1 Take in a minimum of four points measured in the real world in 3d space that repres
  • dojo.parser.parse 仅在第一次调用时工作

    我有一个页面 当用户单击某些报告工具的链接时 它首先要求他们输入一些报告参数 我根据链接的 id 使用 AJAX 以表单形式获取参数对话框 每个对话框上都有一些 dojo 控件 因此我需要在对话框出现时解析它们 因为它最初不是页面的一部分
  • 可以在 Mathematica 中扩展 PDF、CDF、FindDistributionParameters 等功能吗?

    我开始使用新的 Mathematica 统计和数据分析功能进行越来越多的工作 我周二参加了 Mathematica 统计与数据分析 在线研讨会 非常棒的演讲 我强烈推荐 但我遇到了一些问题 我希望这个论坛上的人可以花点时间考虑一下 我创建了
  • VSO/VSTS:在主机代理上使用发布构建工件时出错

    使用 发布构建工件 任务时 构建中会引发以下错误 就在 获取源 之后 任务的定义没有与任何匹配的处理程序 由该代理支持 支持的处理程序 AzurePowerShell AzurePowerShellHandler PowerShell Po
  • 创建会话[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要在 php 中创建会话的帮助 我需要一个登录会话 然后如果用户想更改他们的用户名 他们可以但是 我知道如何更改用户名 但使用会话时情
  • 如何在 React App 完成加载之前显示全页加载器/旋转器

    如何制作全页加载器 旋转器 首先加载 然后显示 直到 React 或不同的基于 JS 的框架 应用程序完全加载 完全加载 是指浏览器旋转器停止旋转的那一刻 我正在为非 js 渲染的网站制作这些加载器 旋转器 但我不确定如何为 JS 渲染的应
  • Google 云端点(应用程序引擎)+ oauth2 与 android 集成

    我正在尝试将谷歌应用程序引擎云端点 API 与 android 集成 我已经按照此链接进行了相同的操作 无法使用我的服务对象连接到我的谷歌端点 https stackoverflow com questions 29544723 unabl
  • 你能强制 Vim 在文件末尾显示一个空行吗?

    当我在记事本中打开文本文件时 如果包含文本的最后一行末尾有回车符 则会显示一个空行 然而 在 Vim 中它不显示这个空行 我注意到的另一件事是 Vim 编辑器默认在最后一行添加回车符 即使它没有显示 我可以这么说 因为如果我在记事本中打开在
  • Java流合并或减少重复对象

    我需要通过将所有重复条目合并到一个对象中来从可以具有重复项的列表中生成一个唯一的朋友列表 Example 从不同的社交源中获取好友并放入 1 个大列表中1 朋友 姓名 约翰尼 德普 出生日期 1970 11 10 来源 FB fbAttri