![](/img/trans.png)
[英]"Incompatible types" error when using collect and map with java streams
[英]Using streams to collect to Map
我有以下TreeMap
:
TreeMap<Long,String> gasType = new TreeMap<>(); // Long, "Integer-Double"
gasType.put(1L, "7-1.50");
gasType.put(2L, "7-1.50");
gasType.put(3L, "7-3.00");
gasType.put(4L, "8-5.00");
gasType.put(5L, "8-7.00");
Map<Integer,TreeSet<Long>> capacities = new TreeMap<>);
键的形式为1L
(一个Long
),形式为"7-1.50"
(一个int
和一个double
的String
串联,由-
分隔)。
我需要创建一个新的TreeMap
,其中通过获取原始Map
的值的int
部分来获得键(例如,对于值"7-1.50"
,新键将是7
)。 新Map
的值将是一个TreeSet
其中包含与新键匹配的原始Map
所有键。
因此,对于上面的输入, 7
键的值将是Set
{1L,2L,3L}。
我可以在没有Stream
的情况下做到这一点,但我想用Stream
做。 任何帮助表示赞赏。 谢谢。
这是一种方法:
Map<Integer,TreeSet<Long>> capacities =
gasType.entrySet()
.stream ()
.collect(Collectors.groupingBy (e -> Integer.parseInt(e.getValue().substring(0,e.getValue ().indexOf("-"))),
TreeMap::new,
Collectors.mapping (Map.Entry::getKey,
Collectors.toCollection(TreeSet::new))));
我修改了原始代码以支持多个数字的整数,因为看起来你想要它。
这会产生Map
:
{7=[1, 2, 3], 8=[4, 5]}
如果您不关心生成的Map
和Set
的排序,您可以让JDK决定实现,这会稍微简化代码:
Map<Integer,Set<Long>> capacities =
gasType.entrySet()
.stream ()
.collect(Collectors.groupingBy (e -> Integer.parseInt(e.getValue().substring(0,e.getValue ().indexOf("-"))),
Collectors.mapping (Map.Entry::getKey,
Collectors.toSet())));
你可以尝试一下,
final Map<Integer, Set<Long>> map = gasType.entrySet().stream()
.collect(Collectors.groupingBy(entry -> Integer.parseInt(entry.getValue().substring(0, 1)),
Collectors.mapping(Map.Entry::getKey, Collectors.toSet())));
UPDATE
如果你想根据“ - ”分割值,因为可能有更多的那个数字,你可以改变它:
final Map<Integer, Set<Long>> map = gasType.entrySet().stream()
.collect(Collectors.groupingBy(entry -> Integer.parseInt(entry.getValue().split("-")[0]),
Collectors.mapping(Map.Entry::getKey, Collectors.toSet())));
其他解决方案就是这样
list = gasType.entrySet()
.stream()
.map(m -> new AbstractMap.SimpleImmutableEntry<Integer, Long>(Integer.valueOf(m.getValue().split("-")[0]), m.getKey()))
.collect(Collectors.toList());
第二步:
list.stream()
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue,Collectors.toCollection(TreeSet::new))));
或者一步到位:
gasType.entrySet()
.stream()
.map(m -> new AbstractMap.SimpleImmutableEntry<>(Integer.valueOf(m.getValue().split("-")[0]), m.getKey()))
.collect(Collectors.groupingBy(Map.Entry::getKey,
Collectors.mapping(Map.Entry::getValue, Collectors.toCollection(TreeSet::new))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.