2 回答
TA贡献1921条经验 获得超9个赞
寻找这样的东西?
public static void main(String... args) {
List<String> list = new ArrayList<>(Arrays.asList("12absc", "2bbds", "abc"));
Map<String, String> stringStringMap = list.stream()
.collect(Collectors.toMap(s -> s, s -> s));
System.out.println(stringStringMap);
}
输出:
{abc=abc, 12absc=12absc, 2bbds=2bbds}
为避免重复键问题,您还可以添加合并功能:
list.add("12absc");
stringStringMap = list.stream()
.collect(Collectors.toMap(s -> s, s -> s, (oldValue, newValue) -> oldValue));
System.out.println(stringStringMap);
输出将相同:
{abc=abc, 12absc=12absc, 2bbds=2bbds}
TA贡献1818条经验 获得超7个赞
Collectors.toMap
至少需要两个参数,一个将流元素映射到映射条目键,另一个将它们映射到相应的映射条目值。
可能你把括号弄错了。它们应该如下所示:
metas.stream().collect(Collectors.toMap(String::toString, Function.identity()));
您收到的消息来自您Collectors.toMap
使用单个参数调用的情况String::toString
。lambda 表达式或方法引用的类型由它们使用的上下文推断,但在这种情况下,没有方法toMap
可以接收可以从中派生类型的单个参数。总之,类型推断器似乎放弃了整个上下文,只看到泛型toMap
方法并执行其签名的部分匹配。它在那里找到一个通用键映射器(接收未知通用类型 T 的值的函数,返回一些其他类型)。不幸的String::toString
是,它不是这种推断类型(因为它只能被解释为接收 aString
而不是任何类型的函数T
)。
添加回答
举报