java - 从流中获取唯一对象(如果存在)

标签 java java-stream

从一个 bean 类开始 MyBean具有单个相关属性:

@Data
class MyBean {
    private String myProperty;
}

现在我有一套这样的 bean Set<MyBean> mySet通常有 0、1 或 2 个元素。

问题是:如何检索 myProperty如果所有元素都相等,则从该集合中获取,否则为 null。最好在单行中,工作量为 O(n)。

我找到了几个例子来确定 boolean 值是否所有属性都相等。但是我想知道相应的属性。

还有比这更聪明的东西吗?

String uniqueProperty = mySet.stream().map(MyBean::getMyProperty).distinct().count() == 1 
    ? mySet.stream().map(MyBean::getMyProperty).findAny().orElse(null) 
    : null;

最佳答案

您的版本已经是 O(n)

可以用一行代码来做到这一点(尽管你的也取决于你如何写它)。

String uniqueProperty = mySet.stream()
    .map(MyBean::getMyProperty)
    .map(Optional::ofNullable)
    .reduce((a, b) -> a.equals(b) ? a : Optional.empty())  // Note: equals compares 2 Optionals here
    .get()  // unwraps first Optional layer
    .orElse(null);  // unwraps second layer

唯一不起作用的情况是所有属性值为 null。您无法区分集合 (null, null)(null, "A"),例如,它们都返回 null

关于java - 从流中获取唯一对象(如果存在),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56259674/

相关文章:

java - 即使为空,如何干净地处理 java 8 流 "findFirst()"结果

java - 将 Object[] 转换为 byte[] 时出错

java - 将对象的数组列表保存到外部文件 Java

java - JVM是如何实现数组类的?

Java Stream .map 三元运算符

Java 8 流更简单

java - 在以下情况下是否可能发生短路评估

java - 比较 Java 中的包装器类型

java - 将匿名函数与流的映射一起使用

java - 如何在没有冗余计算的情况下过滤和映射 Java 8 流中的值?