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

Java流:通过现有流放置新元素

屠锐
2023-03-14

我有一个用例,其中我有一个数据源,比如说:每秒钟,一个新的字符串都来自该数据源。

我想创建一个管道,如果一个新字符串到达,它将被推送到管道中进行处理。

我猜Java8引入的Stream API可以做到这一点,因为它具有处理任意集合的数据的方便功能,但是我想跳过将数据收集到单独的集合中并将到达的数据分派的部分直奔我刚刚创造的溪流。

有办法吗?

共有2个答案

闻人弘雅
2023-03-14

好吧,所以这个特殊案例的答案变得有点不同。

虽然Tomasz Linkowski的答案看起来是一个非常好的解决方案,但它的主要问题是,我的函数比BlockingQueues所建议的更顺序,这对可读性有害。

所以我想出了流。生成器,这正是我需要的,仅此而已。

娄德运
2023-03-14

为了达到你所描述的目的,你需要某种阻塞。我会使用BlockingQueue(任何类型都可以-如果您想避免收集,请使用SynchronousQueue,它根本没有内部状态),并使用流从中创建无限流。生成

例子:

class StreamableQueue<T> {

    private BlockingQueue<T> dataSource;

    Stream<T> asStream() {
        return Stream.generate(this::takeFromDataSource);
    }

    private T takeFromDataSource() {
        try {
            return dataSource.take();
        } catch (InterruptedException ex) {
            throw new RuntimeException(ex);
        }
    }
}

当然,作为dataSource提供给此类的BlockingQueue需要从不同的线程提供元素。

编辑:一个小的添加-您可以使用以下命令,而不是使用try-catch:

  • Lombok在takeFromDataSource()方法上的@Skillythrows注释

 类似资料:
  • 这是流放之路新联盟的开始,你决定创建一个公会,其唯一目的是共享资源并作为一个团队成长。 招募流放者、挖掘者、货币翻转者和工匠。 主宰经济并升级您的公会成员。 注意:本游戏无存档系统,刷新会丢失进度从头开始!

  • 使用XSLT,XSL-FO和阿帕奇FOP的正确组合,我能够将PDF发送到某个浏览器窗口。 实际上,我发送的文件内容如下: 不出所料,浏览器在名为“pdf”的选项卡中显示PDF内容,如果我将文件保存在本地,名称也默认为pdf.pdf 如何强制文件名? 我尝试了以下方法,但没有成功: 为了清楚起见,我想在浏览器中显示内容(而不是直接下载)

  • 我正在研究一些Java8流特性。我对FP相当熟悉,三十年前写过一些Lisp,我想我可能会尝试做一些新工具不真正针对的事情。不管怎样,如果这个问题很愚蠢,我很高兴知道我的错误。 我将给出一个具体的问题,尽管它实际上是我试图解决的一般概念。 假设我想从流的每三个元素中获取一个流。在常规FP中,我将(近似地)创建一个递归函数,该函数通过在删除两个元素之后将列表的第一个元素与列表的其余元素(调用thyse

  • 有没有一种好方法可以向现有的流添加新值?我所能想象的是这样的: 但我正在寻找更简洁的东西,我可以在lambda表达式中使用,而不需要冗长。 当我试图实施PECS原则时,出现了另一个问题: 似乎通配符不适用于流。收集,我想知道为什么。提前谢谢。

  • 我有一个名为的对象,它描述了一个项目的买卖行为。与其他一些属性相比,它主要如下所示: 具有各自的吸气器和设置器。是该项目应出售/购买的金额,ItemData描述该项目的规格。PriceType是一个枚举,它是或。 我现在有一个方法,是哪个工作,在一个列表中找到最匹配的价格。我的所有价格都存储在一个简单称为的列表中。到目前为止,我的方法只是遍历列表,并返回与和匹配的第一个: 然而,这完全忽视了一个事