为现有的Stream添加新的值
是否有一个很好的方法来为现有的Stream
添加一个新的值? 我能想像的是这样的:
public <T> Stream<T> addToStream(Stream<T> stream, T elem ) { List<T> result = stream.collect(Collectors.toList()); result.add(elem); return result.stream(); }
但是我正在寻找更简洁的东西,我可以在没有冗长的lambdaexpression式中使用。
当我尝试实施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实际上包含了他们的数据。 他们不; stream不是数据结构,它们是在各种数据源中指定批量操作的手段。
有两种stream合并器,比如Stream.concat
,以及用于从一组已知元素( Stream.of
)或集合( Collection.stream
)中创buildstream的工厂。 所以如果你想产生一个新的stream,你手头的stream连接在一起,再加上一个描述新元素的新stream,你可以把它们结合起来。
你的PECS例子中的问题是你有三次出现? super T
? super T
,你假设他们描述相同的types,但他们不。 每个通配符的出现对应一个唯一的捕获,这不是你想要的; 您需要为该typesvariables指定一个名称,以便编译器知道列表的types和inputstream的types是相同的。 (另外,不要物化一个集合;这样做很昂贵,如果stream不是有限的,那么这个集合可能不会终止,只需要使用concat。)所以答案是:你刚才得到的generics是错误的。 以下是一种方法:
public<T> Stream<T> appendToStream(Stream<? extends T> stream, T element) { return Stream.concat(stream, Stream.of(element)); }
你把PECS弄糊涂了,因为你正在考虑“插入”stream,实际上你正在消耗它。
怎么样
return Stream.concat(stream, Stream.of(elem));
这是假设原始stream是有限的。 如果不是,可以按相反的顺序连接它们。