如何将多个谓词应用于 java.util.Stream?

2023-11-23

如何将多个谓词应用于java.util.Stream's filter() method?

这就是我现在所做的,但我不太喜欢它。我有一个Collection的事物,并且我需要根据以下内容减少事物的数量Collection过滤器(谓词)的数量:

Collection<Thing> things = someGenerator.someMethod();
List<Thing> filtered = things.parallelStream().filter(p -> {
   for (Filter f : filtersCollection) {
      if (f.test(p))
        return true;
   }
   return false;
}).collect(Collectors.toList());

我知道如果我预先知道过滤器的数量,我可以这样做:

List<Thing> filtered = things.parallelStream().filter(filter1).or(filter2).or(filter3)).collect(Collectors.toList());

但是如何在不混合编程风格的情况下应用未知数量的谓词呢?目前看来,有点丑……


如果你有一个Collection<Predicate<T>> filters您始终可以使用名为的过程从中创建一个谓词减少:

Predicate<T> pred=filters.stream().reduce(Predicate::and).orElse(x->true);

or

Predicate<T> pred=filters.stream().reduce(Predicate::or).orElse(x->false);

取决于您想要如何组合过滤器。

如果在指定的空谓词集合的后备orElse调用履行身份角色(其中x->true做为anding 谓词和x->false做为oring)你也可以使用reduce(x->true, Predicate::and) or reduce(x->false, Predicate::or)获取过滤器,但这对于非常小的集合来说效率稍低,因为它总是将恒等谓词与集合的谓词结合起来,即使它只包含一个谓词。相比之下,变体reduce(accumulator).orElse(fallback)如果集合有大小,上面显示的将返回单个谓词1.


请注意此模式如何适用于类似的问题:Collection<Consumer<T>>你可以创建一个Consumer<T> using

Consumer<T> c=consumers.stream().reduce(Consumer::andThen).orElse(x->{});

Etc.

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

如何将多个谓词应用于 java.util.Stream? 的相关文章

随机推荐

  • 使用 php 获取 mysql 表中记录总数的最佳方法是什么?

    从大表中选择记录总数的最有效方法是什么 目前 我只是在做 result mysql query SELECT id FROM table total mysql num rows result 有人告诉我 如果表中有很多记录 这不是很有效或
  • stringByAppendingPathComponent,它是如何工作的?

    编辑 v002 我看了所有的评论 我开始明白我应该做什么 为此 我修改了我的代码 见下文 我将 newPath 更改为 NSString 删除了 alloc init 和结束 release 因为它现在由系统处理 我正在使用 stringB
  • 向量上的修改时复制语义不会在循环中追加。为什么?

    这个问题听起来似乎得到了部分回答here但这对我来说还不够具体 我想更好地理解何时通过引用更新对象以及何时复制对象 更简单的例子是向量增长 下面的代码在 R 中效率极低 因为在循环之前没有分配内存 并且在每次迭代时都会创建一个副本 x ru
  • Java中有instanceOf(Class c)之类的东西吗?

    我想检查一个对象是否o是该类的一个实例C或的一个子类C 例如 如果x属于班级Point I want x instanceOf Point class to be true并且x instanceOf Object class to be
  • 在 Matlab 中通过函数句柄传递附加参数

    我有一个需要优化的函数 比如 Matlab 中的 Function 该函数取决于我想要优化的变量 例如 x 和一个不需要优化的参数 例如 Q 因此 函数 Function x Q 换句话说 我有一个 Q 值数组 并且想要为每个 Q 找到最佳
  • 获取现有的或创建新的 akka actor

    我正在尝试使用 ActorFor 获取现有的 ActorRef 或创建一个新的 ActorRef 如果它不存在 我有以下代码 但它似乎没有按预期工作 isTermminate 始终为 true ActorSystem system Acto
  • 原子操作会阻塞其他线程吗?

    我试图让 原子与非原子 的概念在我的脑海中扎根 我的第一个问题是我找不到 现实生活中的类比 就像原子操作上的客户 餐厅关系或类似的东西 我还想了解原子操作如何将自己置于线程安全编程中 在这篇博文中 http preshing com 201
  • 安装:Microsoft Visual C++ Redistributable 卡在“正在处理:Windows7_MSU_X64”

    我正在尝试安装 Microsoft Visual C Redistributable 软件包 因为无法安装我的 xampp apache 模块 安装需要很长时间才能完成 我应该怎么办 这种情况常见吗 我所要做的就是等待吗 他们完全被这个设置
  • 如何检查FormData?

    我试过了console log并使用循环遍历它for in 这里是MDN 参考在 FormData 上 两种尝试都在这fiddle var fd new FormData key poulate with dummy data fd app
  • 在 PyQt 中绘制多边形

    背景 我想在屏幕上绘制一个简单的形状 并且我选择 PyQt 作为要使用的包 因为它似乎是最成熟的 我并没有以任何方式锁定它 Problem 仅在屏幕上绘制一个简单的形状 例如多边形 似乎过于复杂 我发现的所有示例都尝试做很多额外的事情 但我
  • 需要无效 Swing 组件的高度

    基本设置是这样的 我有一个垂直的 JSplitPane 我想要一个固定大小的底部组件和一个调整大小的顶部组件 我通过调用来完成setResizeWeight 1 0 在此应用程序中 有一个按钮可恢复 默认 窗口配置 窗口的默认高度是桌面高度
  • 向量化模运算

    我正在尝试编写一些相当快速的分量向量加法代码 我正在使用 我相信是有符号的 64 位整数 函数是 void addRq int64 t a const int64 t b const int32 t dim const int64 t q
  • 以下冒号 (:) 在 MATLAB 语法中意味着什么?

    a imread autumn tif a double a row col dim size a red a 1 green a 2 blue a 3 冒号有什么作用 最后三行是什么意思 上面的片段来自 Dhananjay Thecked
  • 如何在 Junit3 中获得 @BeforeClass 和 @AfterClass 等效项?

    我想在用测试装置替换应用程序的数据库之前备份它 由于 Android 限制 我被迫使用 Junit3 并且我想实现 BeforeClass 和 AfterClass 的等效行为 更新 现在有一个工具 Junit4Android 以获得支持
  • 使用 IText 创建 Pdf 文档#

    如何创建带有表格的 pdf 文档 如下所示 添加命名空间 using iTextSharp text using iTextSharp text pdf 使用c 的代码 Document doc new Document PageSize
  • SimpleAdapter、微调器中的文本和图像

    我有一个小问题 好吧 让我首先说明我想要实现的目标 我有一个旋转器 可以从存储的数组中提取字符串 就像这样 你不需要阅读它 ArrayAdapter
  • Android 中类似 iPhone 的标签栏?

    在 iPhone 中 我们可以创建一个具有选项卡栏的视图 并将其作为应用程序的根视图 然后使用选项卡栏在子视图中导航 Android 中与此最接近的方法是什么 是使用选项卡式控件吗 但这包括仅使用一项活动 在 Android 中使用什么方法
  • 混合声明和代码

    当我使用 gcc o dene Wall ansi pedantic errors dene c 编译函数时 gcc 不会发出错误 你能在 if 循环中查看以 char 开头的行吗 static void remove negation c
  • select() 最大套接字数

    只是更多异步的东西 好吧 现在我的主聊天应用程序有了一个可以工作的异步套接字程序 而且它运行得非常好 不过我有一个担心 使用 select 时 每组中可以使用的文件描述符的最大数量是多少 我读过关于 1024 的限制 如果该限制确实是硬编码
  • 如何将多个谓词应用于 java.util.Stream?

    如何将多个谓词应用于java util Stream s filter method 这就是我现在所做的 但我不太喜欢它 我有一个Collection的事物 并且我需要根据以下内容减少事物的数量Collection过滤器 谓词 的数量 Co