Java初始化列表,根据另一个大小



我想用非null项初始化ArrayList,这取决于另一个变量的大小。

private static final int SIZE_LIST_GROUP_MAP = 10;
public static final List<Map<String, String>> LIST_GROUP_MAP = new ArrayList<>() {  
for(int i=0; i < SIZE_LIST_GROUP_MAP; i++)
{
add(new HashMap<>());  
}  
};

以前有可能做那样的事吗?

如果您对使用第三方库持开放态度,这应该与Eclipse Collections:一起使用

public static final List<Map<String, String>> LIST_GROUP_MAP = 
Lists.mutable.withNValues(SIZE_LIST_GROUP_MAP, HashMap::new);

考虑到您将包含可变Maps的可变List存储在静态变量中,您可能需要考虑使用带有synchronized或ConcurrentMaps的synchronizedList。下面的代码将为您提供一个同步的List,其中包含一组固定的ConcurrentMap实例。

public static final List<Map<String, String>> LIST_GROUP_MAP = 
Lists.mutable.<Map<String, String>>withNValues(
SIZE_LIST_GROUP_MAP,
ConcurrentHashMap::new).asSynchronized()

Eclipse Collections还支持MultiReaderLists。

public static final List<Map<String, String>> LIST_GROUP_MAP = 
Lists.multiReader.withNValues(SIZE_LIST_GROUP_MAP, ConcurrentHashMap::new)

最后,如果静态List的大小永远不会改变,那么您可以使其不可变,如下所示:

public static final ImmutableList<Map<String, String>> LIST_GROUP_MAP =
Lists.mutable.<Map<String, String>>withNValues(
SIZE_LIST_GROUP_MAP,
ConcurrentHashMap::new).toImmutable();

注意:我是Eclipse集合的提交者。

您可以使用双大括号来完成此操作,但最终会得到ArrayList的子类:

private static final int SIZE_LIST_GROUP_MAP = 10;
public static final List<Map<String, String>> LIST_GROUP_MAP = new ArrayList<>() {{
for(int i=0; i < SIZE_LIST_GROUP_MAP; i++)
{
add(new HashMap<>());  
}
}};

查看这个答案以了解更多细节:Java的效率";双支架初始化";?

相关内容

最新更新