【发布时间】:2017-07-03 03:05:32
【问题描述】:
我正在尝试使用 java 8 在不使用 forEach 操作的情况下收集到 ListMultiMap。
如果我用 Java 7 编写代码,它会是这样的:
ListMultimap<String, String> result = ArrayListMultimap.create();
for(State state: states) {
for(City city: state.getCities()) {
result.put(state.getName(), city.getName());
}
}
我在网上找到了一个website,它谈到了创建自己的收集器以在诸如此类的场景中使用。 我将此实现用于收集器。然后我写了以下代码:
ListMultimap<String, String> result = states
.stream()
.flatMap(state -> state.getCities().stream()
.map(city -> {
return new Pair(state, city);
}))
.map(pair -> {
return new Pair(pair.first().getName(), pair.second().getName()));
})
.collect(MultiMapCollectors.listMultimap(
Pair::first,
Pair::second
)
);
但是在collect级别,我只能传递一个参数,我似乎可以找到一种方法来传递两个参数。 按照网站上的示例,我了解到要同时使用两者,我需要在多图中存储一个“对”,如下所示:
ArrayListMultimap<String, Pair> testMap = testObjectList.stream().collect(MultiMapCollectors.listMultimap((Pair p) -> p.first().getName()));
但这不是我想要的,我想使用 Java 8 的收集器(而不是 forEach)使用州名和城市名收集到 ListMultimap。
有人可以帮我吗? 谢谢!
【问题讨论】:
-
该链接后面的代码看起来不太好听;累加器的原始类型、未经检查的强制转换和不需要的类型变量。
-
你是对的!感谢您指出这一点!我认为这很合理,因为我发现很多其他网站都有类似的实现。谢谢!
标签: java java-8 java-stream guava collectors