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

检查java流是否已被使用

贾兴学
2023-03-14

一个类似于Iterator中的hasNext()的方法,在异常抛出和布尔返回行为中(尽管没有与Next()的约定)。

示例:

public void consume(java.util.function.Consumer<Stream<?>> consumer, Stream<?> stream) {
   consumer.accept(stream);
   // defensive programming, check state
   if (...) {
       throw new IllegalStateException("consumer must call terminal operation on stream");
   }
}

目标是在客户端代码调用此方法而不消耗流的情况下早期失败。

一个可接受的答案也可以是“没有解决方案存在”,并有充分的理由说明为什么规范不能添加这样的方法(如果有充分的理由的话)。看起来JDK流通常在其终端方法的开头有以下代码段:

// in AbstractPipeline.java
if (linkedOrConsumed)
    throw new IllegalStateException(MSG_STREAM_LINKED);

因此,对于这些流,实现这样的方法似乎并不困难。

共有1个答案

岑光熙
2023-03-14

考虑到spliterator(例如)是一个终端操作,您可以简单地创建如下方法:

private static <T> Optional<Stream<T>> isConsumed(Stream<T> stream) {

    Spliterator<T> spliterator;
    try {
        spliterator = stream.spliterator();
    } catch (IllegalStateException ise) {
        return Optional.empty();
    }

    return Optional.of(StreamSupport.stream(
        () -> spliterator,
        spliterator.characteristics(),
        stream.isParallel()));
}

我不知道有什么更好的方法...用法为:

Stream<Integer> ints = Stream.of(1, 2, 3, 4)
                                 .filter(x -> x < 3);

YourClass.isConsumed(ints)
         .ifPresent(x -> x.forEachOrdered(System.out::println));

由于我认为没有返回一个已经使用的流的实际理由,所以我将返回optional.empty()

 类似资料:
  • 问题内容: 我在各地搜索过Google,并在其他社区中询问过,并且继续前进到讨论该规范的Oracle文档。但是,该文档更多地涵盖了方法的命名以及整个体系结构,实际上并未提出讨论如何实际编写一些代码来检查x509证书是否被撤销的方法。 也许这只是我头上的办法?但是如果有人可以帮助我,我肯定会感激不尽,我已经将头撞在墙上的墙上已经有大约一周的时间了。 问题答案: 每个CA都会发布已撤销的证书列表。此列

  • 问题内容: PHP中是否可以使用任何函数来检测该函数是否可用? 问题答案: 编辑:根据Ziagl的评论修复了爆炸。

  • 我正在用java创建一个jframe。但我想检查系统上是否已经存在jframe。我尝试过一种方法,从任务管理器获取所有进程,然后查看它是否正在运行,但它不会工作。我使用了这篇文章中的一种方法:https://stackoverflow.com/a/19005828/15349408它的进程名是“javaw.exe”。 它无法检查jframe对象是否为null,因为它将从其他程序运行。是否可以检查j

  • 我想知道检查列表是否为空的最佳方法是什么。在我的Stream中,我调用两次。它有效,但我不知道它是否正确?它看起来有点难看: 当列表为空并且没有找到任何项目时,我必须抛出错误

  • 问题内容: 我需要使用类似于php的isset函数的东西。我知道php和java截然不同,但是php是我先前类似编程知识的唯一基础。是否有某种方法可以返回一个布尔值,用于确定实例变量是否已初始化。例如… 到目前为止,我遇到了这个问题,当我的程序试图隐藏或删除尚未构造的对象时,出现运行时错误。 问题答案: 假设您对是否已为变量 明确赋值 感兴趣,答案是“不是真的”。但绝对的字段(实例变量或类变量)尚

  • 问题内容: 我需要编写一个自定义的批处理文件重命名器。我已经完成了大部分工作,除了我不知道如何检查文件是否已经打开。我只是在使用软件包,并且有一种方法,但是似乎无法测试该文件是否正在被另一个程序使用。关于如何进行这项工作的任何想法? 问题答案: 使用Apache Commons IO库…