[英]"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.