Java 收集器的问题

我正在接触 lambda(是的,太晚了)。我正在尝试将字符串列表转换为 HashMap,键是 toString() 返回的值,值是原始字符串对象。

List<String> metas = new ArrayList<String>();
metas.stream().collect(Collectors.toMap(String::toString), Function.identity());

我得到“类型 String 没有定义适用于此处的 toString(T)”。Collectors.toMap() 的参考文档也调用了一个没有任何参数的方法,如下所示 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java .util.function.Function-java.util.function.Function-

那么为什么我的程序说它没有定义 toString(T)?


萧十郎
浏览 140回答 2
2回答

郎朗坤

寻找这样的东西?public static void main(String... args) {&nbsp; &nbsp; List<String> list = new ArrayList<>(Arrays.asList("12absc", "2bbds", "abc"));&nbsp; &nbsp; Map<String, String> stringStringMap = list.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(s -> s, s -> s));&nbsp; &nbsp; System.out.println(stringStringMap);}输出:{abc=abc, 12absc=12absc, 2bbds=2bbds}为避免重复键问题,您还可以添加合并功能:&nbsp; &nbsp; list.add("12absc");&nbsp; &nbsp; stringStringMap = list.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toMap(s -> s, s -> s, (oldValue, newValue) -> oldValue));&nbsp; &nbsp; System.out.println(stringStringMap);输出将相同:{abc=abc, 12absc=12absc, 2bbds=2bbds}

qq_笑_17

Collectors.toMap&nbsp;至少需要两个参数,一个将流元素映射到映射条目键,另一个将它们映射到相应的映射条目值。可能你把括号弄错了。它们应该如下所示:metas.stream().collect(Collectors.toMap(String::toString,&nbsp;Function.identity()));您收到的消息来自您Collectors.toMap使用单个参数调用的情况String::toString。lambda 表达式或方法引用的类型由它们使用的上下文推断,但在这种情况下,没有方法toMap可以接收可以从中派生类型的单个参数。总之,类型推断器似乎放弃了整个上下文,只看到泛型toMap方法并执行其签名的部分匹配。它在那里找到一个通用键映射器(接收未知通用类型 T 的值的函数,返回一些其他类型)。不幸的String::toString是,它不是这种推断类型(因为它只能被解释为接收 aString而不是任何类型的函数T)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java