Java Stream:通过布尔谓词分为两个列表

2024-04-19

我有一个清单employees。他们有isActive布尔字段。我想分employees分为两个列表:activeEmployees and formerEmployees。是否可以使用 Stream API 来实现?最尖端的方法是什么?


Collectors.partitioningBy https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#partitioningBy-java.util.function.Predicate-:

Map<Boolean, List<Employee>> partitioned = 
    listOfEmployees.stream().collect(
        Collectors.partitioningBy(Employee::isActive));

结果映射包含两个列表,对应于谓词是否匹配:

List<Employee> activeEmployees = partitioned.get(true);
List<Employee> formerEmployees = partitioned.get(false);

使用的原因有几个partitioningBy over groupingBy(根据建议胡安·卡洛斯·门多萨 https://stackoverflow.com/a/46958213/3788176):

首先,参数为groupingBy is a Function<Employee, Boolean>(在本例中),因此有可能向其传递一个可以返回 null 的函数, 意味着如果该函数为任何员工返回 null,则将存在第三个分区。partitioningBy uses a Predicate<Employee>,所以它只能返回 2 个分区。 这会导致NullPointerException被收集器抛出:虽然没有明确记录,但对于空键显式抛出异常,大概是因为Map.computeIfAbsent https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-“如果函数返回 null,则不会记录映射”,这意味着元素将从输出中默默删除。 (谢谢lczapski https://stackoverflow.com/users/11733759/lczapski指出这一点)。

其次,您在结果映射中得到两个列表(*):partitioningBy; with groupingBy,您只能获得元素映射到给定键的键/值对:

System.out.println(
    Stream.empty().collect(Collectors.partitioningBy(a -> false)));
// Output: {false=[], true=[]}

System.out.println(
    Stream.empty().collect(Collectors.groupingBy(a -> false)));
// Output: {}

(*) 此行为未记录在Java 8 Java文档 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#partitioningBy-java.util.function.Predicate-,但它是为Java 9 https://docs.oracle.com/javase/9/docs/api/java/util/stream/Collectors.html#partitioningBy-java.util.function.Predicate-.

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

Java Stream:通过布尔谓词分为两个列表 的相关文章

随机推荐

  • 额外的函数/方法定义是否会增加程序的内存占用?

    在 C 中 定义不使用的附加方法或函数是否会导致更大的内存占用或更慢的执行速度 基本上 我在一个类中有几种实用程序调试方法 这些方法对于该类的正常使用都不是必需的 如果从未使用过这些定义 是否保留这些定义会在内存占用或速度方面产生影响吗 例
  • Netbeans IDE 中企业应用程序项目和 Web 项目应用程序之间的区别

    我想知道 Java EE 项目和 Java Web 项目之间的主要区别netbeansIDE 关于EJB 事实上你可以创建一个基于EJB JPA和 JavaServer Faces 中NetbeansIDE 如果你选择Java Web类别
  • 如何使用 Python 中的电子邮件模块从“application/pkcs7-mime”中提取数据?

    Problem 我正在开展一个项目 我们必须对电子邮件进行分类 对于这个项目 我需要从电子邮件及其附件中提取所有文本 我的问题是某些附件的类型为 application pkcs7 mime 我不知道如何处理这些附件 我尝试过的 impor
  • Ruby NoMethodError - BlahController 的未定义方法“blah_url”

    我从链接调用这个js function createNewTopLevelEntry var user id user val var header prompt Enter the name ajax users user id entr
  • 使用变量将值传递到filter_input()

    谁能解释一下 为什么我会收到非常奇怪的警告 filter input expects parameter 1 to be long string given 执行代码时 这是我的类的一部分 看起来非常好 public static func
  • 编码系统按1的个数排序

    我想到了一个编码系统 arr encoded code decoded code 如下 arr是小于 2 16 pow 2 16 的二进制非负整数数组 arr 0 0 each of arr 1 16 有一个 1 1 10 100 1000
  • 如何以轮子格式安装 Python 库?

    我正在寻找有关如何以轮格式安装 Python 库的教程 它看起来并不简单 所以我希望有一个简单的分步教程 说明如何为 CPython 安装名为 requests 的模块 我从以下位置下载的 https pypi python org pyp
  • ld:为 iOS 模拟器构建,但链接到 dylib?

    我在为模拟器编译应用程序时遇到问题 在设备中运行完美 但是当我尝试在模拟器中编译它时 我收到以下错误 ld building for iOS Simulator but linking against dylib built for Mac
  • MSBUILD 使用 XML 文档文件构建项目

    这应该很容易 但我无法让它发挥作用 我有一个 Web 项目 它引用我的解决方案中的另一个项目 我们称之为 Project1 这两个项目都设置为创建 XML 文档文件 当我右键单击 Web 项目并在 Visual Studio 中构建时 我的
  • 在 pyCharm 上使用张量流

    我是深度学习新手 刚刚在我的 Mac 上安装了 Tensorflow 然而 也存在一些问题 我确信我安装成功 因为我可以使用 python 3 5 在终端上运行tensorflow import tensorflow as tf node1
  • 世博会互动推送通知

    我正在尝试发送交互式推送通知Expo https expo io 我可以很好地发送普通的推送通知 甚至可以发送local交互式推送通知 但是我无法发送远程交互式推送通知 根据本节 https docs expo io versions la
  • 正则表达式仅匹配第一行?

    是否可以使正则表达式仅匹配文本的第一行 所以如果我有文字 这是第一行 这是第二行 无论第一行是什么 它都会匹配 这是第一行 这听起来更像是文件句柄缓冲区的工作 您应该能够将第一行与 m 一如既往 这是 PCRE 语法 the m修饰符使 a
  • 通过 Api 进行信用卡贷记和借记/ACH 贷记和借记,无需用户交互

    我正在寻找一种方法来自动从一张信用卡到另一张信用卡或从一个银行帐户到另一个银行帐户的转账 而最终用户无需登录贝宝或亚马逊支付之类的东西来完成该过程 通过转账 他们的在线余额到他们的银行帐户 这是对先前问题的延伸 用于直接存款的 API AC
  • 在 Swift 中将整数转换为 NSData

    在 Objective C 中 代码看起来像这样 NSInteger random arc4random uniform 99 1 NSData data NSData dataWithBytes random length sizeof
  • 100%宽度的固定div与滚动条重叠

    如此处所示 http codepen io anon pen rVPqeL http codepen io anon pen rVPqeL 我正在使用 3 个简单的 div 我想获得必须消失的 全局 滚动条的效果over标题 html是非常
  • PHP Oracle 查询 select 语句在循环内速度慢

    我有这个 php 函数来检查数据并将其从文本文件插入数据库 Get All Model qModel oci parse c1 SELECT MODELID MODEL NAME FROM MEP TBL MODEL WHERE ACTIV
  • 取消不接受 CancellationToken 的异步操作的正确方法是什么?

    取消以下内容的正确方法是什么 var tcpListener new TcpListener connection tcpListener Start var client await tcpListener AcceptTcpClient
  • 无法在用户控件上设置 DefaultButton

    我正在尝试将用户控件上的按钮设置为页面上的默认按钮 但它不起作用 这是我的用户控件的代码
  • 有没有一种简单的方法将布尔值转换为整数?

    我是 Scala 新手 我发现需要将布尔值转换为整数 我知道我可以使用类似的东西if x 1 else 0但我想知道是否有首选方法 或者语言中内置的东西 即toInt 如果你想混合Boolean and Int操作使用一个implicit如
  • Java Stream:通过布尔谓词分为两个列表

    我有一个清单employees 他们有isActive布尔字段 我想分employees分为两个列表 activeEmployees and formerEmployees 是否可以使用 Stream API 来实现 最尖端的方法是什么 C