当前位置: 首页 > 面试题库 >

如何检查Java 8 Stream是否为空?

颛孙轩昂
2023-03-14
问题内容

Stream作为非终端操作,我如何检查a 是否为空,如果不是则抛出异常?

基本上,我在寻找与下面的代码等效的东西,但是没有在它们之间实现流。特别是,检查不应在终端操作实际消耗流之前进行。

public Stream<Thing> getFilteredThings() {
    Stream<Thing> stream = getThings().stream()
                .filter(Thing::isFoo)
                .filter(Thing::isBar);
    return nonEmptyStream(stream, () -> {
        throw new RuntimeException("No foo bar things available")   
    });
}

private static <T> Stream<T> nonEmptyStream(Stream<T> stream, Supplier<T> defaultValue) {
    List<T> list = stream.collect(Collectors.toList());
    if (list.isEmpty()) list.add(defaultValue.get());
    return list.stream();
}

问题答案:

如果您可以使用有限的并行功能,则以下解决方案将起作用:

private static <T> Stream<T> nonEmptyStream(
    Stream<T> stream, Supplier<RuntimeException> e) {

    Spliterator<T> it=stream.spliterator();
    return StreamSupport.stream(new Spliterator<T>() {
        boolean seen;
        public boolean tryAdvance(Consumer<? super T> action) {
            boolean r=it.tryAdvance(action);
            if(!seen && !r) throw e.get();
            seen=true;
            return r;
        }
        public Spliterator<T> trySplit() { return null; }
        public long estimateSize() { return it.estimateSize(); }
        public int characteristics() { return it.characteristics(); }
    }, false);
}

这是一些使用它的示例代码:

List<String> l=Arrays.asList("hello", "world");
nonEmptyStream(l.stream(), ()->new RuntimeException("No strings available"))
  .forEach(System.out::println);
nonEmptyStream(l.stream().filter(s->s.startsWith("x")),
               ()->new RuntimeException("No strings available"))
  .forEach(System.out::println);

(有效的)并行执行的问题在于,支持对的拆分Spliterator需要一种线程安全的方式来注意是否有任何片段以线程安全的方式看到了任何值。然后执行tryAdvance的最后一个片段必须意识到,这是引发适当异常的最后一个片段(并且它也无法前进)。因此,我没有在此处添加对拆分的支持。



 类似资料:
  • 我有一个名为< code>Person的对象。 它有几个属性; 我设置了一个person对象,比如< code>Person p = new Person(1,“Joe”);。 1.) 我需要检查对象是否为空;以下表达式是否正确; 2.)我需要知道ID是否包含Int。 但是,java不允许这样做。我该怎么办?

  • 问题内容: 如何检查是否为空? 问题答案: 您自己说过的,请检查它是: 看,PHP非常简单。您可以简单地写下您的想法;) 这种方法很安全。如果未设置(可能,但可能),则可能会给您提供未定义的变量E_NOTICE 。

  • 我需要在JPA查询中传递这个参数。 我如何才能实现这一点,而不是为IS NULL&IS NOT NULL创建2个单独的查询。

  • 问题内容: 如何检查大pandas是否为空?就我而言,如果终端为空,我想在终端打印一些消息。 问题答案: 您可以使用该属性检查其是否为空: 资料来源:pandas文件

  • 问题内容: 我有一个名为的对象。 它具有几个属性; 我将一个人对象设置为。 1.)我需要检查对象是否不为null;以下表达式正确吗? 2.)我需要知道ID是否包含一个Int。 但是,java不允许这样做。我该如何检查? 问题答案: An 不为null,如果未初始化,则可能为null 。 如果您希望整数可以为null,则需要使用代替。 此外该语句不能为真,因为如果为null,则将抛出a。所以正确的表

  • 问题内容: 我想在Swing中检查用户名和密码。 该检查适用于用户名,但不适用于JPaswordfield。我正在发布相关代码: 问题答案: 非常简单地获取文本,使用该文本返回文本的a,然后简单地获取数组的长度并检查它是否等于0: