java的Collectors.toMap

小菜问下这个基础代码怎么写?
想使用Collectors.toMap

    Map<Long, String> group = someStringList.stream().collect(Collectors.toMap(xxx,yyy, (key1, key2) -> key2));

someStringList的数据如下示例
101210
101212
102201202
102203205

someStringList是一个List<String> 想把他的内容拆解为2个部分,一部分当key,一部分当value,再按key部分分组


回答:

可能我理解错你的意思了,如果是 toMap 的话,对重复的 Key 只能留一个值,参考 @lpe234 的答案就对了,最多再转一下 Long


你要的不是 toMap,而是 groupingBy

final List<String> sources = List.of("101210", "101212", "102201202", "102203205");

var r = sources.stream()

.map(s -> new String[] { s.substring(0, keyLength), s.substring(keyLength) })

.collect(Collectors.groupingBy(

a -> Long.parseLong(a[0]),

Collectors.mapping(a -> a[1], Collectors.toList())

));

或者这么看起来简洁一点,反正都还要再 mapping 一次,不如合在一起

var r = sources.stream()

.collect(Collectors.groupingBy(

s -> Long.parseLong(s.substring(0, keyLength)),

Collectors.mapping(s -> s.substring(keyLength), Collectors.toList())

));

结果是个 Map<Long, List<String>>

{1012=[10, 12], 1022=[01202, 03205]}


回答:

final List<String> strings = List.of("101210", "101212", "102201202", "102203205");

//

final Map<String, String> stringMap1 = strings.stream()

.map(s -> List.of(s.substring(0, 3), s.substring(3)))

.collect(Collectors.toMap(l -> l.get(0), l -> l.get(1), (o1, o2) -> o2));

System.out.println(stringMap1);

// 输出

// {101=212, 102=203205}

没处理可能出现的异常,不知是否满足你

以上是 java的Collectors.toMap 的全部内容, 来源链接: utcz.com/p/944463.html

回到顶部