使用 Java 8 个流收集到 Guava 的 ListMultiMap
Collect into Guava's ListMultiMap using Java 8 streams
我正在尝试使用 java 8 收集到一个 ListMultiMap 中,而不使用 forEach 操作。
如果我在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
)
);
但是在收集层面,我只能传递一个参数,我似乎可以找到一种传递两个参数的方法。
按照网站上的示例,我了解到要同时使用两者,我需要在多映射中存储一个 "pair",如下所示:
ArrayListMultimap<String, Pair> testMap = testObjectList.stream().collect(MultiMapCollectors.listMultimap((Pair p) -> p.first().getName()));
但这不是我要找的,我想使用 java 8 的收集器(而不是 forEach)使用州名称和城市名称收集到 ListMultimap。
有人可以帮我吗?
谢谢!
ImmutableListMultimap.flatteningToImmutableListMultimap
return states.stream()
.collect(flatteningToImmutableListMultimap(
State::getName,
state -> state.getCities().stream().map(City::getName)));
您可以为此创建一个自定义收集器(请注意 Louis Wasserman 的回答将在内部执行 forEachOrdered,您无法在内部或外部真正转义 forEach)。
ListMultimap<String, String> list = states.collect(Collector.of(ArrayListMultimap::create, (multimap, s) -> {
multimap.putAll(s.getName(), s.getCities().stream().map(City::getName).collect(Collectors.toList()));
}, (multi1, multi2) -> {
multi1.putAll(multi2);
return multi1;
}));
我正在尝试使用 java 8 收集到一个 ListMultiMap 中,而不使用 forEach 操作。
如果我在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
)
);
但是在收集层面,我只能传递一个参数,我似乎可以找到一种传递两个参数的方法。 按照网站上的示例,我了解到要同时使用两者,我需要在多映射中存储一个 "pair",如下所示:
ArrayListMultimap<String, Pair> testMap = testObjectList.stream().collect(MultiMapCollectors.listMultimap((Pair p) -> p.first().getName()));
但这不是我要找的,我想使用 java 8 的收集器(而不是 forEach)使用州名称和城市名称收集到 ListMultimap。
有人可以帮我吗? 谢谢!
ImmutableListMultimap.flatteningToImmutableListMultimap
return states.stream()
.collect(flatteningToImmutableListMultimap(
State::getName,
state -> state.getCities().stream().map(City::getName)));
您可以为此创建一个自定义收集器(请注意 Louis Wasserman 的回答将在内部执行 forEachOrdered,您无法在内部或外部真正转义 forEach)。
ListMultimap<String, String> list = states.collect(Collector.of(ArrayListMultimap::create, (multimap, s) -> {
multimap.putAll(s.getName(), s.getCities().stream().map(City::getName).collect(Collectors.toList()));
}, (multi1, multi2) -> {
multi1.putAll(multi2);
return multi1;
}));