Hashmap - 无法推断参数
Hashmap - cannot infer arguments
嘿 :) 这是我的第一个 post 也是我在流中的第一个方法!我正在尝试自己学习它,但由于它是一种新的编程风格,我很难过 :D
所以这是我的问题:
在下面的方法中,我有一个 的 Map 作为参数。
(成分具有字符串属性“名称”。)
我想要 return 的倒置映射。
(字符串是 class 成分的属性“名称”。)
这是我使用 for 循环的解决方案(有效)
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
ArrayList<String> nameList = new ArrayList<>(articles.values().stream().map(Ingredient::getName).collect(Collectors.toList()));
ArrayList<Long> keyList = new ArrayList<>(articles.keySet());
Map<String, Long> nameAndInvertedMap = new HashMap<>();
for (int i = 0; i<nameList.size(); i++){
nameAndInvertedMap.put(nameList.get(i), keyList.get(i));
}
return nameAndInvertedMap;
}
这是我使用流的方法(我需要帮助)
初始化 HashMap 右侧的“<>”带有红色下划线并表示“无法推断参数”(使用 IntelliJ)
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
Map<String, Long> nameAndInvertedMap = new HashMap<>(
articles.values().stream().map(Ingredient::getName),
articles.keySet().stream().map(articles::get));
return nameAndInvertedMap;
}
感谢您的所有投入、提示、批评,尤其是抽出宝贵时间!
祝大家度过愉快的一天:-)
你的方法实际上并没有达到你希望的效果。正如您从编译器错误中看到的那样,没有接受 List
键和 List
值的 HashMap
构造函数。此外,即使它确实如此,您也在流式传输给定的 Map
(两次),然后尝试交换不同流中的键和值,最后甚至不收集流的值。流是延迟评估的操作管道,如果您不添加终端操作,它们甚至不会执行。
这里有一个 Oracle 的官方教程,很好地总结了流的概念及其工作原理:
https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html#laziness
您可以通过流式传输给定映射的条目来编写您的方法,然后使用 collect(Collectors.toMap())
终端操作收集它们,其中每个 Ingredient
的名称都映射为键,而长键作为它们的值。
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
return articles.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getValue().getName(), entry -> entry.getKey()));
}
请注意,如果有多个键,即在您的情况下重复成分名称,则使用方法 toMap()
的 2 个参数版本收集条目将不起作用。该方法的 3 参数版本应该是首选,因为它允许处理冲突键的情况(多个相同的键映射不同的值)。可能的实现可能是:丢弃一个值而不是另一个值,对值求和等等。
这是一个可能的实现,其中只保留两个值之一。
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
return articles.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getValue().getName(), entry -> entry.getKey(), (longVal1, longVal2) -> longVal1));
}
您的流不正确。应该是这样的:
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
return articles.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getValue().getName(), Map.Entry::getKey));
}
嘿 :) 这是我的第一个 post 也是我在流中的第一个方法!我正在尝试自己学习它,但由于它是一种新的编程风格,我很难过 :D
所以这是我的问题:
在下面的方法中,我有一个
我想要 return
这是我使用 for 循环的解决方案(有效)
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
ArrayList<String> nameList = new ArrayList<>(articles.values().stream().map(Ingredient::getName).collect(Collectors.toList()));
ArrayList<Long> keyList = new ArrayList<>(articles.keySet());
Map<String, Long> nameAndInvertedMap = new HashMap<>();
for (int i = 0; i<nameList.size(); i++){
nameAndInvertedMap.put(nameList.get(i), keyList.get(i));
}
return nameAndInvertedMap;
}
这是我使用流的方法(我需要帮助)
初始化 HashMap 右侧的“<>”带有红色下划线并表示“无法推断参数”(使用 IntelliJ)
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
Map<String, Long> nameAndInvertedMap = new HashMap<>(
articles.values().stream().map(Ingredient::getName),
articles.keySet().stream().map(articles::get));
return nameAndInvertedMap;
}
感谢您的所有投入、提示、批评,尤其是抽出宝贵时间! 祝大家度过愉快的一天:-)
你的方法实际上并没有达到你希望的效果。正如您从编译器错误中看到的那样,没有接受 List
键和 List
值的 HashMap
构造函数。此外,即使它确实如此,您也在流式传输给定的 Map
(两次),然后尝试交换不同流中的键和值,最后甚至不收集流的值。流是延迟评估的操作管道,如果您不添加终端操作,它们甚至不会执行。
这里有一个 Oracle 的官方教程,很好地总结了流的概念及其工作原理:
https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html#laziness
您可以通过流式传输给定映射的条目来编写您的方法,然后使用 collect(Collectors.toMap())
终端操作收集它们,其中每个 Ingredient
的名称都映射为键,而长键作为它们的值。
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
return articles.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getValue().getName(), entry -> entry.getKey()));
}
请注意,如果有多个键,即在您的情况下重复成分名称,则使用方法 toMap()
的 2 个参数版本收集条目将不起作用。该方法的 3 参数版本应该是首选,因为它允许处理冲突键的情况(多个相同的键映射不同的值)。可能的实现可能是:丢弃一个值而不是另一个值,对值求和等等。
这是一个可能的实现,其中只保留两个值之一。
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
return articles.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getValue().getName(), entry -> entry.getKey(), (longVal1, longVal2) -> longVal1));
}
您的流不正确。应该是这样的:
public static Map<String, Long> focusOnNameAndInvert(Map<Long, Ingredient> articles) {
return articles.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getValue().getName(), Map.Entry::getKey));
}