Java 使用Streams API和Collectors.toMap()以对象引用作为键构造映射

Java 使用Streams API和Collectors.toMap()以对象引用作为键构造映射,java,lambda,collections,java-8,java-stream,Java,Lambda,Collections,Java 8,Java Stream,我想构造一个映射,即使用项引用作为键,使用一些任意的列表作为值。我尝试了以下内容,但它将在IntelliJ中显示类型推断错误(但是,它仍将编译) 然后尝试了相同的方法,使用get()方法访问引用: List<Item> items = getItems(...); Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(Item::get, new ArrayList&

我想构造一个
映射
,即使用
引用作为键,使用一些任意的
列表
作为值。我尝试了以下内容,但它将在IntelliJ中显示类型推断错误(但是,它仍将编译)

然后尝试了相同的方法,使用
get()
方法访问引用:

List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(Item::get, new ArrayList<>()));
List items=getItems(…);
Map itemMap=items.stream().collect(Collectors.toMap(Item::get,new ArrayList());
现在它至少可以编译了,但感觉不对

一个人如何才能以正确的方式解决这个问题呢


编辑:问题现在与最初发布的完全不同,从收到的评论中可以看出。

在您的第一次尝试中,应该是:

List<Item> items = getItems(...);
Map<Item, String> itemMap = items.stream()
                                 .collect(Collectors.toMap(i->i, 
                                                           i->"some string"));

实现它的正确方法是包含这样一个类型参数

List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(Function.<Item>identity(), v -> new ArrayList<>()));
List items=getItems(…);
Map itemMap=items.stream().collect(Collectors.toMap(Function.identity(),v->newarraylist());
或者

List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(v -> v, v -> new ArrayList<String>()));
List items=getItems(…);
Map itemMap=items.stream().collect(Collectors.toMap(v->v,v->newarraylist());

第二种方法无法编译,原因与第一种方法无法编译完全相同。除了两个都缺少一个
,它们还使用了一个字符串常量,而供应商应该是
供应商。@Eran:我肯定他的答案不是。只需2秒钟即可证明。我投票赞成结束这个问题;OP似乎对解决问题并不感兴趣…@Holger是的,我尝试了OP的答案代码(或者至少是类似的代码,用字符串代替Item),结果得到了与问题原始代码相同的错误。@我猜当你直截了当地断言“不是这样,请看我的答案”时,会出现屈尊的语气这是一个正确的答案,而你的答案甚至没有编译(至少在你发表评论的时候它没有编译)。我试过这段代码,它肯定能编译。由于a)打字错误,b)基本类型错误,您的代码无法工作。令人难以置信的是,仅静态导入
toMap
会在IntelliJ中产生推断错误,而不是由
javac
复制!现在我感到困惑,我确信IntelliJ将与
javac
结果一致;这段对话已经结束。
List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream()
                                       .collect(Collectors.toMap(i->i, 
                                                                 i->new ArrayList<>()));
List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(Function.<Item>identity(), v -> new ArrayList<>()));
List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(v -> v, v -> new ArrayList<String>()));