Java初始化List,根据另一个Size

Java Initialize List, according to another Size

我想做一些事情用非空项初始化 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<>());  
  }  
};

是否可以像以前那样做?

你可以用双括号来完成,但你最终会得到一个 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<>());  
    }
}};

查看此答案了解更多详情:Efficiency of Java "Double Brace Initialization"?

如果您愿意使用第三方库,这应该适用于 Eclipse Collections:

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

考虑到您要在静态变量中存储包含可变 Maps 的可变 List,您可能需要考虑使用同步 List 和 synchronized 或 ConcurrentMap相反。以下代码将为您提供一个同步 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 Collections 的提交者。