为什么 Stream.flatMap 不能接受 collection?
Why can't Stream.flatMap accept a collection?
给出以下数据为例classes:
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)...
但是该代码无法编译,因为 "getRegions" 的 return 值是一个 Collection(列表),而不是 flatMap 方法接受的流。
但是因为我知道任何 Collection 都可以通过它的 Collection.stream() 方法进行流式传输,所以这应该不是问题。我还是被迫这样写:
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
后者(给定更丰富的上下文)远不如前者可读。
问题是,有什么原因让我错过了,因为它这么笨重吗?我在我们的框架中有很多例子,在这些例子中我被迫走那条路,总是让我感到酸味。
(猜猜我只需要将 Kotlin 添加到我们的项目中并使用采用 Collection 的 flatMap 方法扩展 Stream class :p 还是我?)
技术原因,虽然不理想,但可能是未完成的原因。您不能在 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)
但它不会很漂亮。
给出以下数据为例classes:
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)...
但是该代码无法编译,因为 "getRegions" 的 return 值是一个 Collection(列表),而不是 flatMap 方法接受的流。 但是因为我知道任何 Collection 都可以通过它的 Collection.stream() 方法进行流式传输,所以这应该不是问题。我还是被迫这样写:
countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
后者(给定更丰富的上下文)远不如前者可读。
问题是,有什么原因让我错过了,因为它这么笨重吗?我在我们的框架中有很多例子,在这些例子中我被迫走那条路,总是让我感到酸味。 (猜猜我只需要将 Kotlin 添加到我们的项目中并使用采用 Collection 的 flatMap 方法扩展 Stream class :p 还是我?)
技术原因,虽然不理想,但可能是未完成的原因。您不能在 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)
但它不会很漂亮。