首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么mapMulti与flatMap相比需要类型信息?

为什么mapMulti与flatMap相比需要类型信息?
EN

Stack Overflow用户
提问于 2022-02-05 14:11:14
回答 1查看 272关注 0票数 5

我希望使用mapMulti而不是flatMap,并重构以下代码:

代码语言:javascript
复制
// using flatMap (version 1) => returns Set<Item>
var items = users.stream()
                 .flatMap(u -> u.getItems().stream())
                .collect(Collectors.toSet());

(第2版):

代码语言:javascript
复制
// using mapMulti (version 2) => returns Set<Item>
var items = users.stream()
                 .<Item>mapMulti((u, consumer) -> u.getItems().forEach(consumer))
                 .collect(Collectors.toSet());

两个都返回相同的元素。但是,我怀疑是否真的应该用更详细的mapMulti代码来替换我的所有mapMulti。为什么我需要在mapMuli (.<Item>mapMulti)之前添加类型信息。如果我不包含类型信息,它将返回一个Set<Object>。(如何)我可以简化mapMulti

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-05 14:58:20

注意,当您使用flatMap时,推断结果流类型所需的类型与使用mapMulti时非常不同。

使用flatMap时,结果流的类型与lambda主体的返回类型相同。这是编译器设计用来推断类型变量的一件特殊事情(即编译器“知道”它)。

但是,在mapMulti的情况下,您可能想要的结果流的类型只能从您对consumer lambda参数所做的事情中推断出来。假设,编译器可以被设计成,例如,如果您说了consumer.accept(1),那么它会查看您传递给accept的内容,并看到您想要一个Stream<Integer>,而在getItems().forEach(consumer)的情况下,Item类型可能来自的唯一地方是getItems的返回类型,所以它需要查看它。

您基本上是要求编译器根据其中任意表达式的类型推断lambda的参数类型。编译器根本没有被设计为这样做。

除了添加<Item>前缀之外,还有其他(更长的)方法可以让它推断Stream<Item>作为mapMulti的返回类型。

使lambda显式地输入:

代码语言:javascript
复制
var items = users.stream()
             .mapMulti((User u, Consumer<Item> consumer) -> u.getItems().forEach(consumer))
             .collect(Collectors.toSet());

添加一个临时流变量:

代码语言:javascript
复制
// By looking at the type of itemStream, the compiler can figure out that mapMulti should return a Stream<Item>
Stream<Item> itemStream = users.stream()
             .mapMulti((u, consumer) -> u.getItems().forEach(consumer));
var items = itemStream.collect(Collectors.toSet());

我不知道这是否更“简化”,但我认为如果使用方法引用,则会更简洁:

代码语言:javascript
复制
var items = users.stream()
             .map(User::getItems)
             .<Item>mapMulti(Iterable::forEach)
             .collect(Collectors.toSet());
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70998802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档