我想在单个语句(可能包含多个嵌套语句)中声明一个完全填充的地图字段,如下所示:
private static final Map<Integer,Boolean> map =
something-returning-an-unmodifiable-fully-populated-HashMap;
匿名初始化程序不会这样做,原因与调用返回新填充映射的函数不会这样做的原因相同:匿名初始化程序需要两个顶级语句:一个用于变量声明,一个用于方法或初始化器。
双花括号({{
和}}
)惯用语可以工作,但是它创建了一个Extended的新类HashMap<>
,而我不喜欢由此表示的开销。
Java 8的lambda也许提供了一种更好的方法来实现这一点?
这是在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();
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 ) );
问题内容: 我需要一个ConnectionFactory类型的实例字段。供应商可以做到: 可以将其缩短为一行,如下所示: 有没有办法使用lambda使其更简洁一些?我试过以下内容,但无法编译: 问题答案: 您上一个代码段中的问题是编译器无法猜测 是实现接口SAM的lambda表达式(似乎您首先错过了表达式的括号,但无论如何)。 您可以做的是强制转换lambda,以告知编译器这实际上是您实现的接口的
问题内容: 你将如何在Java中初始化静态变量? 方法一:静态初始化器 方法二:实例初始化器(匿名子类)或其他方法? 各自的优缺点是什么? 这是说明两种方法的示例: 问题答案: 在这种情况下,实例初始化器只是语法糖,对吗?我不明白为什么你只需要一个额外的匿名类即可进行初始化。如果正在创建的类是最终的,那将是行不通的。 你也可以使用静态初始化程序创建不可变映射:
如果String和其他类一样,那么如何使用双引号初始化它?
我有一个非常基本的问题。我需要如何为ArrayList键入parrameters才能在BlueJ中使用代码?我有一个方法如下。
我试图初始化一个< code>constexpr引用,但没有成功。我试过了 但我收到了编译时错误 错误:constexpr变量“z”必须由常量表达式初始化 删除< code>const会导致 错误:将对类型“int”的引用绑定到类型“const int”的值会删除限定符 尽管我感觉< code>constexpr自动暗示变量声明的< code>const。 所以我的问题是: < Li > < co
问题内容: 如果String和其他字符串一样是一个类,如何使用双引号将其初始化? 问题答案: Java的设计者决定保留面向对象语言中的原始类型,而不是将所有内容都变成对象,以提高语言的性能。原语存储在调用堆栈中,这需要较少的存储空间,并且操作成本较低。另一方面,对象存储在程序堆中,这需要复杂的内存管理和更多的存储空间。 出于性能原因,Java的String设计为介于基本体和类之间。 例如 注意: