当前位置: 首页 > 知识库问答 >
问题:

Java 8 Spliterator(或类似)返回一个值,因为只有一个值

漆雕恺
2023-03-14

我是单一或空流运营商的忠实粉丝。它不在标准库中,但我发现它非常有用。如果流只有一个值,它将在“可选”中返回该值。如果它没有值或有多个值,则返回可选.empty()

Optional<Int> value = someList.stream().{singleOrEmpty}
[]     -> Optional.empty()
[1]    -> Optional.of(1)
[1, 1] -> Optional.empty()
etc.

我之前问了一个问题,@ThomasJungblut想出了这个很棒的实现:

public static <T> Optional<T> singleOrEmpty(Stream<T> stream) {
    return stream.limit(2)
        .map(Optional::ofNullable)
        .reduce(Optional.empty(),
             (a, b) -> a.isPresent() ^ b.isPresent() ? b : Optional.empty());
}

唯一的问题是,你必须把它放在你的电话开始时

singleOrEmpty(someList.stream().filter(...).map(...))

而不是按顺序结束

someList.stream().filter().map().singleOrEmpty()

这使得它比其他流机制更难阅读。

作为流处理的新手,有人知道如何在一系列流转换的末尾设置一个短路的< code > single empty 机制吗?

共有1个答案

郑胡媚
2023-03-14

它没有limit(2)的速度快,但是可以作为< code>list.stream()使用。过滤器(...).地图(...).collect(singleOrEmpty())

static <T> Collector<T, ?, Optional<T>> singleOrEmpty() {
    return Collectors.collectingAndThen(
            Collectors.mapping(
                    Optional::of,
                    Collectors.reducing((a, b) -> Optional.empty())
            ),
            o -> o.orElseGet(Optional::empty)
    );
}

Stream.empty().collect(singleOrEmpty());   // Optional.empty
Stream.of(1).collect(singleOrEmpty());     // Optional[1]
Stream.of(1, 1).collect(singleOrEmpty());  // Optional.empty
Stream.of(1, 1).skip(1).collect(singleOrEmpty());  // Optional[1]

值得一提的是,除非这是真正的性能关键代码,否则我个人更喜欢不太聪明但更清晰的实现

static<T> Collector<T,?,Optional<T>> singleOrEmpty() {
    return Collectors.collectingAndThen(
            Collectors.toList(),
            lst -> lst.size() == 1
                    ? Optional.of(lst.get(0))
                    : Optional.empty()
    );
}
 类似资料:
  • 问题内容: 我对这种函数式编程和流技术有点陌生,但是我所知道的一点却非常有用! 我遇到过几次这种情况: 我真正想要的是: 我认为,除了与结合使用外,该东西在其他情况下也可能有用。当我成为超级n00b时,我花了很多时间重新发明Java Collections Framework,因为我不知道它在那里,所以我试图不重蹈覆辙。Java是否提供了执行此操作的好方法?我说错了吗? 谢谢! 编辑:这是案例的一

  • 我对函数式编程和流的东西有点陌生,但我所知道的一点非常有用! 我认为除了与结合使用之外,还可以在其他情况下使用。当我还是uber n00b的时候,我花了很多时间重新设计Java集合框架,因为我不知道它在那里,所以我试着不重复我的错误。Java是否提供了一种很好的方法来完成的事情?我说错了吗? 谢谢! 编辑:下面是一些案例的示例数据。如果忽略步骤:

  • 问题内容: 我有两个文件:script1.py和script2.py。我需要从script1.py调用script2.py,然后将script2.py的值返回给script1.py。但是要注意的是script1.py实际上通过os运行script2.py。 script1.py: script2.py 如您所见,我能够将值输入到script2中,但不能返回到script1中。我怎样才能做到这一点?

  • 我有一个家庭作业,我应该写几个方法(例如,提示客户输入汽车类型并返回有效汽车类型的方法),然后我的程序应该显示汽车类型,租车天数,额外费用等。这是老师想让我写的第一种方法, 如何打印出此方法的返回值?我应该添加系统吗?(“汽车类型是...部分在提示为汽车类型()?

  • 问题内容: 我希望在整个应用程序生命周期中只有一个类的5个实例。我该如何实现?如果可能,请提供示例代码。 问题答案: 由于Singleton应该由枚举组成(请参见“有效Java”): 格蕾兹·加德

  • 问题内容: 我有这种简单的查询,它返回给定id的非空整数字段: 问题是,如果找不到ID,则结果集为空。我需要查询始终返回一个值,即使没有结果也是如此。 我有这个东西工作,但我不喜欢它,因为它运行相同子查询的2倍: 如果该行存在,则返回field1,否则返回0。有什么改进的方法吗? 谢谢! 编辑以下一些评论和答案 :是的,它必须在 单个查询语句中, 并且我不能使用count技巧,因为 我只需要返回1