为什么Stream.flatMap不能接受集合?

Luk*_*kas 8 java collections java-8 java-stream flatmap

给出以下作为数据类的示例:

class Country {

    List<Region> regions = new ArrayList<>();

    List<Region> getRegions() {
        return regions;
    }

}

class Region {

    String getName() {
        return "some name";
    }

}
Run Code Online (Sandbox Code Playgroud)

假设我有一份国家清单

    List<Country> countries = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)

我想将这些内容传递给他们的区域及其相应的名称我想做以下事情:

    countries.stream().flatMap(Country::getRegions).map(Region::getName)...
Run Code Online (Sandbox Code Playgroud)

但是,该代码无法编译,因为"getRegions"的返回值是Collection(List),而不是flatMap方法接受的Stream.但是因为我知道任何Collection都可以通过其Collection.stream()方法进行流式传输,这应该不是问题.我还是被迫写成如下:

    countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...
Run Code Online (Sandbox Code Playgroud)

这是(给定更丰富的背景)远比前者更不可读.

问题是,有什么理由,我错过了,因为这是那么笨重?我在我们的框架中有很多例子,我不得不采取这种方式,总是让我有一种酸味.(猜猜我只需要将Kotlin添加到我们的项目中并使用flatMap方法扩展Stream类,该方法采用Collection:p或者我?)

Pet*_*rey 15

技术原因,这不是理想的,但可能是为什么没有这样做.您不能在Java中使用泛型类型重载.

他们需要支持

 Stream.flatMap(Function<Object, Stream<X>> function)
Run Code Online (Sandbox Code Playgroud)

这意味着他们不能超载它

 Stream.flatMap(Function<Object, Collection<X>> function)
Run Code Online (Sandbox Code Playgroud)

因为这两种方法在擦除后具有相同的签名.

他们可以添加一种方法

 Stream.flatMapCollection(Function<Object, Collection<X>> function)
Run Code Online (Sandbox Code Playgroud)

要么

 Stream.flatMapIterable(Function<Object, Iterable<X>> function)

 Stream.flatMapI(Function<Object, Iterable<X>> function)
Run Code Online (Sandbox Code Playgroud)

但它不会很漂亮.

  • @khelwood它可能不会更短.理想情况下,他们会添加对稀有类型的支持和对泛型的重载. (2认同)