当前位置: 首页 > 面试题库 >

为什么Stream.flatMap无法接受集合?

杜凯
2023-03-14
问题内容

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

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”的返回值是一个Collection(列表),而不是flatMap方法接受的Stream。但是由于我知道任何Collection都可以通过其Collection.stream()方法进行流传输,所以这应该不是问题。我仍然被迫将其编写如下:

    countries.stream().flatMap(c -> c.getRegions().stream()).map(Region::getName)...

(鉴于上下文更加丰富)其可读性远低于前者。

问题是,有什么理由让我错过这个庞大的东西?我在我们的框架中有很多例子,在这些例子中,我被迫沿着那条路走,总是让我感到酸涩。(猜测我只需要将Kotlin添加到我们的项目中,并使用采用Collection:p的flatMap方法扩展Stream类,或者我可以?)


问题答案:

一个技术原因,虽然不是很理想,但可能是为什么没有做到这一点。您不能在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)

但这不会很漂亮。



 类似资料:
  • < b >想改进这个问题?更新问题,以便通过编辑此帖子用事实和引用来回答问题。 为什么没有函数(没有任何参数)来展平

  • 我的脚本将,作为参数: 但当我将它作为分隔符传递时,它是空的 我知道在参数/参数解析中很特殊,但我以和引用的形式使用它。 为什么它不起作用?我使用的是Python 3.7.3 这是测试代码: 当我运行它作为它打印空。

  • 问题内容: 由于它可能是Java语言中使用最广泛的方法之一,因此为什么它必须接受字符串数组并且没有它就无法工作?例如,我可以一直住: 过度 除了能够接受命令行参数之外,还有其他更高的目的吗,尤其是因为绝大多数Java程序都是GUI驱动的,并且不需要通过命令行接收args? 问题答案: 甚至GUI驱动的Java应用程序也将从某些主要方法开始。“更高的目的”从来没有接受命令行参数。 目的只是接受参数。

  • 请求是: localhost:8888/article/createArticle?articleid=1&text=我是一篇文章 为什么收不到请求?

  • 我有一个java代码,以特定的格式输入日期。 现在我输入的是无效日期。但它返回的日期是2016年1月14日星期四18:31:30。为什么会这样?如何使其返回null作为日期?

  • 问题内容: 在Java中,为什么不能在接口中使用受保护的方法? 由于根据Java规范 受保护的访问(由关键字protected表示)-同一包中任何类型以及任何包中的子类均可访问的字段或方法。 如果我必须使用该接口,那么我将实现它并覆盖方法。因此,如果我要实现类可以访问这些方法的位置,因为该方法可以在任何包中访问。那么,将方法声明为Interface中的保护有什么害处? 问题答案: 受保护的方法旨在