【问题标题】:Add value to Hashtable using lambda使用 lambda 向 Hashtable 添加值
【发布时间】:2017-12-04 15:12:33
【问题描述】:

首先,我对 Java 还很陌生,我解决问题的方法可能不是最佳的。

我有一些字符串列表,例如 {"a", "b", "e", "g"}{"no", "a", "g", "great"},它们包含 4 个项目,每个项目来自一组值。

我想创建该集合的Hashtable分配一个int 值给每个String。对于特定的String,我想使用 lambda 表达式 基于 其他项目不同的值 /strong> 在它包含的列表中,类似于:

class bla {
    static Map stuff;
    static {
        // If I write it like this, I get the error "Cannot resolve method ContainsAll"
         stuff.put("g", (aList) -> (aList.containsAll(Arrays.asList("a", "b", "e", "g")) ? 1 : 2)); 
    }
}

如果我像这样将List<String> 添加到(aList)(List <String> aList) 那么我得到一个“lambda 表达式的目标类型必须是一个接口”错误。

如果我将 () 替换为 lambda 主体的 {},我会收到“;预期错误”。

我怎样才能写这个工作?或者,您有更好的主意吗?

【问题讨论】:

  • 您似乎在尝试随机的事情,而不是阅读您正在使用的类的 javadoc。第一个提示:JDK 中没有任何方法以大写字母开头。
  • ^ 你几乎肯定不需要 lambda 来做你想做的事。
  • 另外,不要使用原始类型。你想要一个 Map。不是地图。
  • "if i write it like this, i get the error Cannot resolve method ContainsAll" 根据Java Naming Conventions 方法名称以小写字母开头...
  • 您到底想达到什么目的?我不知道你想要映射什么,是什么决定了int 值?似乎您在基础知识而不是您的具体问题上更加挣扎。在尝试解决问题之前,也许您应该先阅读一些关于这些事情如何工作的教程。然后您可能会理解为什么编译器会抱怨。以及如何将代码重写为更合适的格式。

标签: java arraylist lambda hashmap hashtable


【解决方案1】:

这应该对你有用。

哦,你想要Map<String,Integer>,而不是HashtableHashtable 并未被弃用,但对于您的大多数用例来说非常糟糕和缓慢。

import java.util.*;
import java.util.function.*;
import java.util.stream.*;
public class Main {
  public static void main(String[] args) {
    Map<String,Integer> map = Stream.of("no", "a", "g", "great")
      .collect(Collectors.toMap(
        Function.identity(),
        x -> Arrays.asList("a", "b", "e", "g").contains(x) ? 1 : 2
      ));
    System.out.println(map);
  }
}

输出:

{a=1, no=2, g=1, great=2}

【讨论】:

  • 谢谢,不过我好像没说清楚。所以,我有一堆字符串我想用作 HashMap 中的键,我在其中为它们分配值。我还有一些固定数量的字符串列表,比如 4,我想根据 HashMap 中的值创建新的整数列表。如果一个或多个字符串是特定列表的一部分(由某些字符串组成,而不是按任何顺序),则需要分配不同的值。我希望这更清楚。
【解决方案2】:

我发现我的错误.. 终于。我知道我发布的代码更多的是我想要的想法,我专注于这一行:

stuff.put("g", (aList) -> (aList.containsAll(Arrays.asList("a", "b", "e", "g")) ? 1 : 2)); 

我意识到 HashMap 需要定义为 Map(String, InterfaceName) 而不是 (String, Integer):

interface Something{
    int doStuff(List<String> blabla);
}

class bla{
    static Map<String, Something> stuff;
    static{
        stuff = new HashMap<>();
        stuff.put("a", (List<String> aList) -> 30); 
        stuff.put("g", (List<String> aList) -> aList.containsAll(Arrays.asList("a", "b", "e", "g")) ? 10 : 25); // I only need this for a few of the strings
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 2010-11-08
    • 1970-01-01
    • 2017-03-22
    • 2021-08-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多