给出以下作为数据类的示例:
class Country {
List<Region> regions = new ArrayList<>();
List<Region> getRegions() {
return regions;
}
}
class Region {
String getName() {
return "some name";
}
}
假设我有一个国家列表
List<Country> countries = new ArrayList<>();
我想将这些内容传递给他们的区域及其相应的名称我想做以下事情:
countries.stream().flatMap(Country::getRegions).map(Region::getName)...
但是,由于&#34; getRegions&#34;的返回值,该代码无法编译。是一个Collection(List)而不是Stream,flatMap方法接受它。 但是因为我知道任何Collection都可以通过其Collection.stream()方法进行流式处理,这不应该是一个问题。我仍然被迫写如下:
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
哪个(给定更丰富的上下文)远不如前者那么可读。
问题是,有什么理由,我错过了,因为这是笨重的?我在我们的框架中有很多例子,我不得不采取这种方式,总是让我有一种酸味。 (猜猜我只需要将Kotlin添加到我们的项目中并使用flatMap方法扩展Stream类,该方法采用Collection:p或者我?)
答案 0 :(得分:15)
技术原因,这并不理想,但可能就是为什么没有这样做。您不能在Java中对泛型类型进行重载。
他们需要支持
Stream.flatMap(Function<Object, Stream<X>> function)
这意味着他们不能用
超载它 Stream.flatMap(Function<Object, Collection<X>> function)
因为这两种方法在擦除后具有相同的签名。
他们可以添加方法
Stream.flatMapCollection(Function<Object, Collection<X>> function)
或
Stream.flatMapIterable(Function<Object, Iterable<X>> function)
Stream.flatMapI(Function<Object, Iterable<X>> function)
但它不会很漂亮。