为现有的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是有限的。 如果不是,可以按相反的顺序连接它们。