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));
}