Java - 使用流+ lambda 的多个集合的交集

2023-12-19

我有以下函数用于统一多个集合(包括重复元素):

public static <T> List<T> unify(Collection<T>... collections) {
        return Arrays.stream(collections)
               .flatMap(Collection::stream)
               .collect(Collectors.toList()); 
}

如果有一个具有类似签名的函数来进行集合的交集(使用类型相等),那就太好了。例如:

public static <T> List<T> intersect(Collection<T>... collections) {
     //Here is where the magic happens
}

我找到了 intersect 函数的实现,但它不使用流:

public static <T> Set<T> intersect(Collection<? extends Collection<T>> collections) {
    Set<T> common = new LinkedHashSet<T>();
    if (!collections.isEmpty()) {
       Iterator<? extends Collection<T>> iterator = collections.iterator();
       common.addAll(iterator.next());
       while (iterator.hasNext()) {
          common.retainAll(iterator.next());
       }
    }
    return common;
}

有什么方法可以实现类似于使用流的 unify 函数的东西吗?我对 java8/stream api 不太有经验,因此一些建议会非常有帮助。


您可以在某些实用程序类中编写自己的收集器并使用它:

public static <T, S extends Collection<T>> Collector<S, ?, Set<T>> intersecting() {
    class Acc {
        Set<T> result;

        void accept(S s) {
            if(result == null) result = new HashSet<>(s);
            else result.retainAll(s);
        }

        Acc combine(Acc other) {
            if(result == null) return other;
            if(other.result != null) result.retainAll(other.result);
            return this;
        }
    }
    return Collector.of(Acc::new, Acc::accept, Acc::combine, 
                        acc -> acc.result == null ? Collections.emptySet() : acc.result, 
                        Collector.Characteristics.UNORDERED);
}

用法非常简单:

Set<T> result = Arrays.stream(collections).collect(MyCollectors.intersecting());

但请注意,收集器不能短路:即使中间结果是空集合,它仍然会处理流的其余部分。

这样的收藏家很容易在我的免费网站中找到StreamEx https://github.com/amaembo/streamex图书馆(参见MoreCollectors.intersecting() http://amaembo.github.io/streamex/javadoc/one/util/streamex/MoreCollectors.html#intersecting--)。它可以像上面一样与普通流一起使用,但是如果您将它与 StreamEx(它扩展了普通流)一起使用,它就会变得短路:处理实际上可能会提前停止。

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

Java - 使用流+ lambda 的多个集合的交集 的相关文章

  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • MI设备中即使应用程序被杀死,如何运行后台服务

    您好 我正在使用 alaram 管理器运行后台服务 它工作正常 但对于某些 mi 设备 后台服务无法工作 我使用了服务 但它无法工作 如何在 mi 中运行我的后台服务 MI UI有自己的安全选项 所以你需要的不仅仅是上面提到的粘性服务 你需
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Java:从元素创建 DOM 元素,而不是文档

    如您所知 在 Java 中创建 Dom 元素的正确方法是执行以下操作 import org w3c dom Document import org w3c dom Element Document d Element e e d creat
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • JavaFX - setVisible 隐藏元素但不重新排列相邻节点

    在 JavaFX 中 如果我有一个场景有 2VBox元素和每个VBox有多个Label in it 如果我设置顶部VBox to 无形的 为什么底部VBox 不向上移动顶部的场景VBox was The VBox is 无形的但我希望其他物
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 使用 java 按电子邮件发送日历邀请

    我正在尝试使用 java 发送每封电子邮件的日历邀请 收件人收到电子邮件 但不会显示接受或拒绝的邀请 而是将该事件自动添加到他的日历中 我正在使用 ical4j jar 构建活动 邀请 private Calendar getInvite
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • 让JScrollPane控制多个组件

    对于我的应用程序 我正在设计一个脚本编辑器 目前我有一个JPanel其中包含另一个JPanel保存行号 位于左侧 以及JTextArea用于允许用户输入代码 位于右侧 目前 我已经实施了JScrollPane on the JTextAre
  • Apache Commons CLI:替代已弃用的 OptionBuilder?

    IntelliJ 显示此示例代码中不推荐使用 OptionBuilderhttp commons apache org proper commons cli usage html http commons apache org proper
  • 在 Selenium WebDriver 上如何从 Span 标签获取文本

    在 Selenium Webdriver 上 如何从 span 标记检索文本并打印 我需要提取文本UPS Overnight Free HTML代码如下 div id customSelect 3 class select wrapper
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • struts 教程或示例

    我正在尝试在 Struts 中制作一个登录页面 这个想法是验证用户是否存在等 然后如果有错误 则返回到登录页面 错误显示为红色 典型的登录或任何表单页面验证 我想知道是否有人知道 Struts 中的错误管理教程 我正在专门寻找有关的教程 或
  • Java 编码风格、局部变量与重复方法调用

    我更喜欢使用局部变量而不是多次调用同一方法 I prefer this Vehicle vehicle person getVehicle if vehicle instanceof Car Car car Car vehicle car
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • jQuery悬停:淡入隐藏的div,同时淡出“默认”div

    function wrap hover function wrap image fadeOut 100 function wrap text fadeIn 100 function wrap text fadeOut 100 functio
  • Haskell——有什么方法可以限定记录名称或消除记录名称的歧义吗?

    我有两种数据类型 用于hastache模板 在我的代码中 有两种不同的类型是有意义的 两者都有一个名为 name 的字段 这当然会引起冲突 似乎有一种机制可以消除对 名称 的任何调用的歧义 但实际的定义会引起问题 是否有任何解决方法 例如让
  • Flutter:如何以编程方式打开抽屉

    我想打开Drawer以编程方式而不是通过滑动它 如何禁用该滑动功能 抽屉的触摸功能 空安全代码 Using GlobalKey final GlobalKey
  • 在Python中将RAR文件的内容读取到内存中

    我正在寻找一种方法将特定文件从 rar 存档读取到内存中 具体来说 它们是编号图像文件的集合 我正在编写漫画阅读器 虽然我可以简单地解压这些文件并根据需要加载它们 完成后删除它们 但如果可能的话 我宁愿避免这种情况 话虽如此 如果可能的话
  • 使用qmake成功编译SSE指令(但无法识别SSE2)

    我正在尝试编译并运行从 Unix 迁移到 Windows 的代码 我的代码是纯 C 不使用 Qt 类 在 Unix 下没问题 我还使用 Qt Creator 作为 IDEqmake exe with spec win32 g 用于编译 正如
  • 使用 Eclipse 的 C 项目上的链接器错误

    我想为 STM32F217IG 微控制器创建一个项目 所以我安装了 Eclipse 和GNU for ARM 嵌入式 GCC 交叉编译器 https launchpad net gcc arm embedded 我不认为这是 Code So
  • Paypal 沙盒 PDT 失败 4020

    因此 我创建了一个沙盒交易 并尝试在我的感谢页面上获取它的数据
  • Linux中的printf问题

    以下是在 HP 和 Linux 上打印格式化 1 2 的简单程序 然而 行为是不同的 我不想让问题变得更大 但实际发生这种情况的程序在字符串中有一个浮点值 因此使用 f 不是一个选项 即使使用 sprintf 以前有人遇到过这种情况吗 哪种
  • 使用 VS2012 RC 构建 boost

    我刚刚下载了适用于 Windows 8 64 位的 Visual Studio 2012 RC 我尝试编译 boost 库 版本 1 51 但是当我在 Visual Studio 提示命令中执行 make 时 出现错误 我在帖子末尾发布了
  • 使用自定义配置运行 ng build

    我有 Angular 项目 我想将其部署在 Apache 服务器上 我用ng build但我想为后端自定义地址和端点 proxy conf json api target http localhost 8080 secure false l
  • 使用容器视图控制器访问导航栏

    编写自己的容器时关于 UINavigationController 和 UINavigatinBar 的两个问题 1 我使用故事板创建了初始容器并将其嵌入到 UINavigationController 中 我发现 childViewCon
  • java缓存hashmap每天都会过期

    我想要一个HashMap
  • 如何从 C++ COM 迁移到 C++CLI

    我有一个通过 COM 公开内容的 C DLL 我想将其转换为公开托管接口的 C CLI 理想情况下 我只需添加 CLI 并一一转换接口即可 到目前为止我还没有取得任何成功 所以我正在寻找具体的策略 更多详情 很久以前 我创建了一个使用 CO
  • 世界地图与 ggmap

    我正在使用 ggmap 并希望有一张以澳大利亚为中心的世界地图 我可以轻松地绘制地理编码点 与其他一些地图包相比 ggmap 似乎更容易使用 然而 当我使用下面的代码浏览地图时 它会出错 gc lt geocode australia ce
  • Random ArrayIndexOutOfBoundsException,使用流按值对 Map 元素进行排序

    最近几天 我开始 玩 一些 Java 8 功能 例如流 我研究了一些文档和几个示例 在我的应用程序中 我有一个 Map 我需要获取具有最高值的三个元素 浮动部分 我尝试对我的代码进行不同的修改 其中一些解决方案还 按值对 Map 进行排序
  • Membership.ValidateUser 在 IIS 上始终返回 false

    Membership ValidateUser 方法适用于开发服务器 iis express 和 cassini 但在我的 IIS 上 它作为我的开发机器上的应用程序发布 它总是返回false 即使用户被批准 也不会被锁定 并且用户名和密码
  • 在 ACE 编辑器中应用Deltas

    我正在尝试在 Ace 编辑器中保存更改操作 然后回放它们 下面有一些伪代码 要点是 applyDeltas API 似乎没有为我的编辑器做任何事情 我绑定到编辑器更改事件 将更改增量推送到数组 并尝试稍后播放它 当我运行下面的代码时 我没有
  • data:text/html 处的网页对于某些 WebView text/html 内容字符串不可用

    我正在使用以下 Java 代码创建一些用于显示内容的 HTML public String htmlFromArrayList ArrayList
  • 如何写入 BitLocker 加密卷的物理扇区?

    I call CreateFile 我打开 PhysicalDrive0 然后我读取了 BitLocker 加密卷的扇区 一切正常 通过这种方式 我可以创建使用 BitLocker 加密的卷的物理 加密 扇区的备份副本 然后 我打电话Cre
  • Java - 使用流+ lambda 的多个集合的交集

    我有以下函数用于统一多个集合 包括重复元素 public static