【问题标题】:Flatmap in java: is the lambda really necessary?java中的Flatmap:lambda真的有必要吗?
【发布时间】:2020-04-12 07:58:42
【问题描述】:

这是一个代码示例(来自 Mykong.com):

String[][] data = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};

//Stream<String[]>
Stream<String[]> temp = Arrays.stream(data);

//Stream<String>, GOOD!
Stream<String> stringStream = temp.flatMap(x -> Arrays.stream(x));

如果我理解正确,这里的 lambda 正在执行实际的展平,但 flatMap 无法理解需要进行什么展平以便可以省略 lambda?

编辑:flatMap 是否可以有一个默认的 lambda 用于以“直观”的方式进行转换?

【问题讨论】:

  • flatmap 正在展平字符串数组流
  • 不,它不能。这对你来说很明显,因为这个特定的 Stream 是 String[] 的 Stream,你无法想象任何其他方式将其转换为 Stream。但也许有人会想从数组的末尾而不是开头来转换它。如果它是一个 Stream 呢?没有参数的 flatMap() 方法如何将 Car 转换为 Stream? Stream 对它的元素的所有了解就是它们是对象。
  • lambda here is doing the actual flattening 不,这里的 lamda 将数组转换为流
  • @JBNizet:不是数组/列表的对象流如何被 flatMap 展平? flatMap 会接受数组数组或列表数组或列表列表等以外的其他内容吗?
  • 当然:streamOfCars.flatMap(car -&gt; car.getPassengers().stream())

标签: java flatmap


【解决方案1】:

lambda 不是必需的,您可以通过方法引用来完成同样的事情。但实际上这两种方法是相同的。

最后一行可能是:

Stream<String> stringStream = temp.flatMap(Arrays::stream);

【讨论】:

  • 好的,但是 flatMap 似乎需要一些说明才能工作。我不确定我是否理解 JB Nizet 关于 Stream 的评论,因为我认为 flatMap 可以处理列表等列表——尽管汽车的数组/列表可能是扁平化的,但如何将汽车展平。
  • 一步一步来:第 1 行你有一个字符串数组。第 2 行为您提供了一个字符串数组流。第 3 行最终将其全部解包,将字符串数组流转换为字符串流。从 String[][] -> String[] -> String 有 3 个解包。
猜你喜欢
  • 2018-04-05
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2017-10-29
相关资源
最近更新 更多