我想在单个语句(可能包含多个嵌套语句)中声明一个完全填充的 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/