gpt4 book ai didi

java - 使用身份键将流映射到映射的快捷方式

转载 作者:行者123 更新时间:2023-11-30 07:40:54 24 4
gpt4 key购买 nike

考虑以下示例代码通过将每个字符串映射到它的长度并打印每个映射条目来处理字符串列表

package com.dbenergie.ndm.bnb.business;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Application {

public static void main(String[] args) {
final List<String> strings = Arrays.asList("Hello", "World", "!");

// 1
final Map<String, Integer> stringCharacterCountMapping = strings.stream()
.collect(Collectors.toMap(Function.identity(), String::length));

stringCharacterCountMapping.entrySet().stream().forEach(System.out::println);
}
}

现在,我个人觉得相当困惑或类似样板的是使用 Function.identity()(在 1)将每个流条目显式映射为映射的键,但每个映射收集器到目前为止,我发现需要一个键映射器——是否有一些我忽略的收集器,或者如果我需要这个,我是否必须定义我自己的收集器?有类似的东西会很方便

Collectors.toMap(String::length);

或类似的。有什么想法吗?

最佳答案

There is no toMap method in the Collectors class that does not take a keyMapper.我怀疑这是因为您传递的单个参数映射到的内容可能非常模棱两可。值还是键?

您可以轻松地自己编写这样一个收集器:

class MyCollectors {
public static <K, U> Collector<K, ?, Map<K,U>> toMapWithValueWrapper(Function<? super K, ? extends U> valueMapper) {
return Collectors.toMap(Function.identity(), valueMapper);
}
}

请注意签名与 Collectors.toMap 略有不同。只有 2 个通用参数。原来的Collectors.toMap有3个——T(我们收集的类型),K(key的类型)和U (值的类型)。由于您对 key 使用身份函数,因此 key 的类型始终与我们收集的类型相同,因此 T == K。因此,我们可以消除T

编辑:

正如 Holger 在评论中建议的那样,我们不必强制 T == K 因为 T 可能是 K 的子类并且您仍然可以使用身份函数将 T 映射到 K。因此,你可以使用这个:

class MyCollectors {
public static <T extends K, K, U> Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends U> valueMapper) {
return Collectors.toMap(Function.identity(), valueMapper);
}
}

如果你想允许收集到一个 map ,其键类型是你正在收集的类型的父类(super class)。

关于java - 使用身份键将流映射到映射的快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56846807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com