小编典典

如何使用Lambda初始化地图?

java

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

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

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

双花括号({{}})惯用语可以工作,但是它创建了一个Extended的新类HashMap<>,而我不喜欢由此表示的开销。

Java 8的lambda也许提供了一种更好的方法来实现这一点?


阅读 169

收藏
2020-11-16

共1个答案

小编典典

这是在Java 8中使用lambda在单个语句中实现字段初始化器的方法。

private static final Map<Integer,Boolean> map =
        ((Supplier<Map<Integer,Boolean>>)() -> {
            Map<Integer,Boolean> mutableMap = new HashMap<>();
            mutableMap.put( 1, false );
            mutableMap.put( 2, true );
            return Collections.unmodifiableMap( mutableMap );
        }).get();

Java 9解决方案:

private static final Map<Integer,Boolean> map = Map.of( 1, false, 2, true );

并且如果您有10个以上的条目,Map.of()将无法使用,因此您需要这样做:

private static final Map<Integer,Boolean> map = Map.ofEntries( 
        Map.entry( 1, false ), 
        Map.entry( 2, true ), 
        Map.entry( 3, false ), 
        Map.entry( 4, true ), 
        Map.entry( 5, false ), 
        Map.entry( 6, true ), 
        Map.entry( 7, false ), 
        Map.entry( 8, true ), 
        Map.entry( 9, false ), 
        Map.entry( 10, true ), 
        Map.entry( 11, false ) );
2020-11-16