使用流 API 和 Collectors.toMap() 使用对象引用作为键构造一个映射
Construct a Map using object reference as key using Streams API and Collectors.toMap()
我想构造一个 Map<Item, List<String>>
,即使用 Item
引用作为键,使用任意 List<String>
作为值。我尝试了以下操作,但它会在 IntelliJ 中显示类型推断错误(但是,它仍然会 compile);
List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(i->i, new ArrayList<>()));
然后我通过 Item
、get()
中的辅助方法创建了一个解决方法,它只是 returns 它自己的实例;
public Item get(){ return this; }
然后尝试同样的方法,使用get()
方法访问引用:
List<Item> items = getItems(...);
Map<Item, List<String>> 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"));
您缺少 )
和值的 lambda 表达式的参数名称。
将 Map 的值更改为 List 并没有太大区别:
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>()));
我想构造一个 Map<Item, List<String>>
,即使用 Item
引用作为键,使用任意 List<String>
作为值。我尝试了以下操作,但它会在 IntelliJ 中显示类型推断错误(但是,它仍然会 compile);
List<Item> items = getItems(...);
Map<Item, List<String>> itemMap = items.stream().collect(Collectors.toMap(i->i, new ArrayList<>()));
然后我通过 Item
、get()
中的辅助方法创建了一个解决方法,它只是 returns 它自己的实例;
public Item get(){ return this; }
然后尝试同样的方法,使用get()
方法访问引用:
List<Item> items = getItems(...);
Map<Item, List<String>> 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"));
您缺少 )
和值的 lambda 表达式的参数名称。
将 Map 的值更改为 List 并没有太大区别:
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>()));