[英]Why is there no Instance-level Stream.concat method in Java?
我知道Stream.concat
存在( doc )来连接两个流。 但是,我遇到了需要在现有流中添加“更多”项目,然后继续处理它的情况。 在这种情况下,我本来希望能够将以下方法联系在一起:
getStream(someArg)
.map(Arg::getFoo)
.concat(someOtherStreamOfFoos) // Or append, or...
.map(...)
但是,不存在这种实例级可链接的append/concat
方法。
这不是一个问题,要求解决这个问题,或更优雅的方法(虽然我当然会感激任何其他观点!)。 相反,我问的是导致这一决定的设计因素。 我信任,Stream界面是由一些非常聪明的人设计的,他们都知道最小惊讶原则 - 所以,我必须假设他们决定省略这个(对我而言)直观明显的方法,这意味着该方法是一个反模式,或由于某些技术限制而无法实现。 我很想知道原因。
我可以给你一个不起作用的理由。
Stream.concat
定义为
static <T> Stream<T> concat(Stream<? extends T> a,
Stream<? extends T> b)
您可以concat
一个Stream<HashMap>
和Stream<Map>
成Stream<Map>
,甚至concat
一个Stream<HashMap>
和Stream<TreeMap>
成Stream<Map>
。 要使用实例方法执行此操作,您需要能够声明类型参数,如<U super T>
,Java不允许。
// It'd look kind of like this, if Java allowed it.
public <U super T> Stream<U> concat(Stream<? extends U> other)
Java只允许上限类型参数,而不是下限。
连接Stream<Something>
和Stream<SomethingElse>
可能看起来很不寻常,但类型推断通常会生成特定的类型参数,无法使用实例方法。 例如,
Stream.concat(Stream.of(dog), animalStream)
如果写成,则需要显式类型参数
Stream.<Animal>of(dog).concat(animalStream)
我认为它只是错过了Stream API的功能。
请注意,RxJava的Observable具有所需功能的“concatWith”方法,因此您的问题是合理的:
Observable<String> o1 = ...;
Observable<Integer> o2 = ...;
o1.map(s -> s.length())
.concatWith(o2)
....
如果当前的Optional为空,Java 8还有另一个很好的功能就是获取另一个可选项,如:
Optional.ofNullable(x).orElse(anotherOptional)
我想说的是你所描述的这个结论是可能的,只是没有在Stream
实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.