gpt4 book ai didi

java - 为现有 Stream 添加新值(value)

转载 作者:IT老高 更新时间:2023-10-28 13:51:24 24 4
gpt4 key购买 nike

有没有向现有 Stream 添加新值的好方法?我能想象的都是这样的:

public <T> Stream<T> addToStream(Stream<T> stream, T elem ) {
List<T> result = stream.collect(Collectors.toList());
result.add(elem);
return result.stream();
}

但我正在寻找可以在 lambda 表达式中使用而无需冗长的更简洁的东西。

在我尝试实现PECS原理的时候又出现了一个问题:

public <T> Stream<? super T> addToStream(Stream<? super T> stream, T elem ) {
List<? super T> result = stream.collect(Collectors.toList()); //error
result.add(elem);
return result.stream();
}

似乎通配符不适用于 Stream.collect,我想知道为什么。提前致谢。

最佳答案

这个问题掩盖了一个不正确的假设:流实际上包含它们的数据。他们不;流不是数据结构,它们是跨各种数据源指定批量操作的一种方式。

有用于将两个流合并为一个的组合器,例如 Stream.concat,以及用于从一组已知元素创建流的工厂 (Stream.of) 或来自集合 (Collection.stream)。因此,如果您想生成一个新流,该流是您手头的流的串联,您可以结合这些流,以及描述新元素的新流。

您的 PECS 示例中的问题是您出现了 3 次 ? super T,并且您假设它们描述了相同的类型,但事实并非如此。通配符的每次出现都对应一个唯一的捕获,这不是您想要的;您需要为该类型变量命名,以便编译器知道列表的类型和输入流的类型相同。 (另外,不要实现集合;如果流不是有限的,这很昂贵,并且可能不会终止。只需使用 concat。)所以答案是:你只是弄错了泛型。这是一种方法:

public<T> Stream<T> appendToStream(Stream<? extends T> stream, T element) {
return Stream.concat(stream, Stream.of(element));
}

您将自己与 PECS 混淆了,因为您正在考虑“插入”到流中,而实际上您正在消耗它。

关于java - 为现有 Stream 添加新值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28785833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com