java - 如何使用 lambda 初始化 map ?

标签 java dictionary collections lambda java-8

我想在单个语句(可能包含多个嵌套语句)中声明一个完全填充的 map 字段,如下所示:

private static final Map<Integer,Boolean> map = 
    something-returning-an-unmodifiable-fully-populated-HashMap;

匿名初始化器不会做,因为调用返回新填充映射的函数不会做的原因相同:它们需要两个顶级语句:一个用于变量声明,一个用于方法或初始化器.

双花括号({{}})惯用语会起作用,但它创建了一个扩展HashMap<> 的全新类,我不喜欢由此带来的开销。

Java 8 的 lambda 是否提供了更好的方法来实现这一目标?

最佳答案

如果你想初始化一个Map在一条语句中,您可以使用 Collectors.toMap .

假设您想构建一个 Map<Integer, Boolean>将整数映射到调用某个函数的结果 f :

private static final Map<Integer,Boolean> MAP = 
        Collections.unmodifiableMap(IntStream.range(0, 1000)
                                             .boxed()
                                             .collect(Collectors.toMap(i -> i, i -> f(i))));

private static final boolean f(int i) {
    return Math.random() * 100 > i;
}

如果您想用“静态”已知值初始化它,就像您答案中的示例一样,您可以像这样滥用 Stream API:

private static final Map<Integer, Boolean> MAP = 
       Stream.of(new Object[] { 1, false }, new Object[] { 2, true })
             .collect(Collectors.toMap(s -> (int) s[0], s -> (boolean) s[1]));

请注意,这是一个真正的滥用,我个人永远不会使用它:如果您想构造一个具有已知静态值的 Map,使用 Streams 没有任何好处,您会更好关闭以使用静态初始值设定项。

关于java - 如何使用 lambda 初始化 map ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32868665/

相关文章:

dictionary - 如何将一个字典中的项目添加到另一个字典中

c# - 如何用两个具有相同键的不同字典中的值构建新词典

java - 如何用部分字符串验证 HashMap containsValue

java.util.ArrayList 无法转换为 java.lang.Comparable

java - 如何以编程方式配置 Tomcat 的 session 跟踪模式

java - 密码验证不允许在屏幕末尾出现特殊字符

java - 使用 fxml 使用 javafx 填充表数据

java - 如何在android java中的日历对象中传递小时,分钟和秒

java - 在 Java 中搜索集合

list - 如何逆转Groovy集合的种类?