【发布时间】:2019-02-18 18:11:38
【问题描述】:
我有一个 List 和 Objects,每个都包含一个 X、Y 值 (Doubles) 和一个名称 String。由于我有多个与坐标对应的同名条目,因此我想将每个名称链接到所有坐标,我通过创建Map 类型的<String, List<Object>> 设法做到这一点
输出示例:
One [[0.1,0.1,0.1],[0.2,0.3,0.4]]
One,Two [[0.1,0.1] ,[0.4,0.5]]
One,Two,Three [[0.1,0.1] ,[0.6,0.7]]
我现在要做的是将有逗号,的名称拆分并达到以下结果:
One [[0.1,0.1,0.1,0.1,0.1,0.1],[0.2,0.3,0.4,0.5,0.6,0.7]]
Two [[0.01,0.01,0.01,0.01] ,[0.4,0.5,0.6,0.7]]
Three [[0.01,0.01] ,[0.6,0.7]]
我的 WORKS 代码是:
Map<String, List<Coordinates>> newList = coordinateList.stream()
.collect(Collectors.groupingBy(Coordinates::getName));
创建第一个Map。
为了完成第二部分,我尝试了以下各种组合,但没有运气:
newList.entrySet().stream()
.flatMap(entry -> Arrays.stream(entry.getKey().split(","))
.map(s -> new AbstractMap.SimpleEntry<>(s, entry.getValue())))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.flatMapping(entry -> entry.getValue().stream(), Collectors.toList())));
我得到的错误是:
The method flatMapping((<no type> entry) -> {}, Collectors.toList()) is undefined for the type Collectors
请注意,将flatMapping 更改为mapping 可以工作,但不能解决问题。
我尝试过的代码的另一个变体是:
Map<String, List<Object>> collect1 = map.entrySet().stream()
.flatMap(entry -> Arrays.stream(entry.getKey().split(","))
.map(s -> new AbstractMap.SimpleEntry<>(s, entry.getValue())))
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())))
.entrySet().stream()
.flatMap(entry -> entry.getValue().stream()
.flatMap(Collection::stream)
.map(o -> new AbstractMap.SimpleEntry<>(entry.getKey(), o)))
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
仍然没有运气,我经常收到错误Cannot infer type argument(s) for <R> flatMap(Function<? super T,? extends Stream<? extends R>>)
有什么想法吗?
【问题讨论】:
-
您的第一次尝试对我有用。请注意,
Collectors.flatMapping直到 Java 9 才出现。您确定您配置了正确的目标 JDK? -
@teppic 我将最新的 java 库 (11.0...) 添加到我的项目文件夹中,但仍然是同样的错误。
标签: java dictionary java-8 java-stream java-9