为了账号安全,请及时绑定邮箱和手机立即绑定

Java 收集器的问题

Java 收集器的问题

萧十郎 2021-08-04 17:22:39
我正在接触 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)?
查看完整描述

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}


查看完整回答
反对 回复 2021-08-04
?
qq_笑_17

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)。


查看完整回答
反对 回复 2021-08-04
  • 2 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信