Java 使用HashMap和List进行嵌套双大括号初始化

Java 使用HashMap和List进行嵌套双大括号初始化,java,android,collections,Java,Android,Collections,我正在尝试控制我的应用程序的某些权限。 昨天我学习了如何创建双大括号初始化,它帮助了很多。但是现在我试着用它嵌套,但是我得到了一个 ')' expected 来自IDE(Android Studio) 这是我的密码: public static final Map<String, List> ALL_PERMISSIONS = new HashMap<String, List>() {{ put("Change-maps", new ArrayList<I

我正在尝试控制我的应用程序的某些权限。 昨天我学习了如何创建双大括号初始化,它帮助了很多。但是现在我试着用它嵌套,但是我得到了一个

')' expected
来自IDE(Android Studio)

这是我的密码:

public static final Map<String, List> ALL_PERMISSIONS = new HashMap<String, List>() {{
    put("Change-maps", new ArrayList<Integer>(){{add(R.id.button_change_view);}};);
    put("Stores-info-view", new ArrayList<Integer>(){{add(R.id.details_fragment);}};);
    put("Competitors-layer", new ArrayList<Integer>(){{add(R.id.switch_concorrentes);}};);
}};
public static final Map ALL_PERMISSIONS=new HashMap(){{
put(“更改映射”,new ArrayList(){{add(R.id.button_Change_view);}};);
put(“存储信息视图”,新的ArrayList(){{add(R.id.details_fragment);}};);
put(“竞争对手层”,新的ArrayList(){{add(R.id.switch_concorrentes);}};
}};
我是不是遗漏了什么? 这是一个糟糕的方法吗


PS:我正在尝试这种方法,因为将来我将使用带有多个视图(整数)的一些键,以及带有字符串列表的一些键。

如果您查看以下代码:

Map<String, String> map = new HashMap<String, String>();
map.put( "string1", "string2" );
因此,您不需要
前面加上
的右括号,如下所示:

public static final Map<String, List> ALL_PERMISSIONS = new HashMap<String, List>() {{
        put("Change-maps", new ArrayList<Integer>(){{add(R.id.button_change_view);}});
        put("Stores-info-view", new ArrayList<Integer>(){{add(R.id.details_fragment);}});
        put("Competitors-layer", new ArrayList<Integer>(){{add(R.id.switch_concorrentes);}});
}};
public static final Map ALL_PERMISSIONS=new HashMap(){{
put(“更改映射”,new ArrayList(){{add(R.id.button_Change_view);});
put(“存储信息视图”,新ArrayList(){{add(R.id.details_fragment);}});
put(“竞争对手层”,新的ArrayList(){{add(R.id.switch_concorrentes);}});
}};

如果您查看此代码:

Map<String, String> map = new HashMap<String, String>();
map.put( "string1", "string2" );
因此,您不需要
前面加上
的右括号,如下所示:

public static final Map<String, List> ALL_PERMISSIONS = new HashMap<String, List>() {{
        put("Change-maps", new ArrayList<Integer>(){{add(R.id.button_change_view);}});
        put("Stores-info-view", new ArrayList<Integer>(){{add(R.id.details_fragment);}});
        put("Competitors-layer", new ArrayList<Integer>(){{add(R.id.switch_concorrentes);}});
}};
public static final Map ALL_PERMISSIONS=new HashMap(){{
put(“更改映射”,new ArrayList(){{add(R.id.button_Change_view);});
put(“存储信息视图”,新ArrayList(){{add(R.id.details_fragment);}});
put(“竞争对手层”,新的ArrayList(){{add(R.id.switch_concorrentes);}});
}};

您应该格式化/缩进代码(
Ctrl-Shift-F
在Eclipse中默认情况下)

您将看到匿名
ArrayList
类声明(在一组花括号之外)后面不能跟分号

下面是一个格式化的示例:

public static final Map<String, List> ALL_PERMISSIONS = new HashMap<String, List>() {
    {
        put("Change-maps", new ArrayList<Integer>() {
            {
                add(R.id.button_change_view);
            }
        });
        put("Stores-info-view", new ArrayList<Integer>() {
            {
                add(R.id.details_fragment);
            }
        });
        put("Competitors-layer", new ArrayList<Integer>() {
            {
                add(R.id.switch_concorrentes);
            }
        });
    }
};
public static final Map ALL_PERMISSIONS=new HashMap(){
{
放置(“更改映射”,新建ArrayList(){
{
添加(R.id.button\u change\u view);
}
});
放置(“存储信息视图”,新建ArrayList(){
{
添加(R.id.details\u片段);
}
});
放置(“竞争对手层”,新ArrayList(){
{
添加(R.id.switch\u concorrentes);
}
});
}
};
注意


还要注意原始类型或抑制警告

您应该格式化/缩进代码(
Ctrl-Shift-F
在Eclipse中默认设置)

您将看到匿名
ArrayList
类声明(在一组花括号之外)后面不能跟分号

下面是一个格式化的示例:

public static final Map<String, List> ALL_PERMISSIONS = new HashMap<String, List>() {
    {
        put("Change-maps", new ArrayList<Integer>() {
            {
                add(R.id.button_change_view);
            }
        });
        put("Stores-info-view", new ArrayList<Integer>() {
            {
                add(R.id.details_fragment);
            }
        });
        put("Competitors-layer", new ArrayList<Integer>() {
            {
                add(R.id.switch_concorrentes);
            }
        });
    }
};
public static final Map ALL_PERMISSIONS=new HashMap(){
{
放置(“更改映射”,新建ArrayList(){
{
添加(R.id.button\u change\u view);
}
});
放置(“存储信息视图”,新建ArrayList(){
{
添加(R.id.details\u片段);
}
});
放置(“竞争对手层”,新ArrayList(){
{
添加(R.id.switch\u concorrentes);
}
});
}
};
注意


还要注意原始类型或抑制警告

我不鼓励使用双括号初始化。正如所解释的,它可能

  • 让你的同事感到惊讶,而且很难阅读
  • 损害性能
  • 可能导致对象相等性问题(创建的每个对象都有一个 唯一类对象)
  • 如果可能的话,我建议使用

    例如:

    public static final Map<String, List> ALL_PERMISSIONS =  ImmutableMap.<String, List>of(
            "Change-maps", ImmutableList.of(R.id.button_change_view),
            "Stores-info-view", ImmutableList.of(R.id.details_fragment),
            "Competitors-layer", ImmutableList.of(R.id.switch_concorrentes)
    );
    
    public static final Map ALL_PERMISSIONS=ImmutableMap.of(
    “更改地图”,不可变列表(R.id.按钮更改视图),
    “存储信息视图”,不可变列表(R.id.details\u片段),
    “竞争对手层”,不可变列表(R.id.switch\u concorrentes)
    );
    
    或者,如果需要添加更多元素:

    public static final Map<String, List> ALL_PERMISSIONS =  new ImmutableMap.Builder<String, List>()
            .put("Change-maps", ImmutableList.of(R.id.button_change_view))
            .put("Stores-info-view", ImmutableList.of(R.id.details_fragment))
            .put("Competitors-layer", ImmutableList.of(R.id.switch_concorrentes))
            //(... and so on...
            .build();
    
    public static final Map ALL_PERMISSIONS=new ImmutableMap.Builder()
    .put(“更改地图”,不可变列表(R.id.button\u Change\u view))
    .put(“存储信息视图”,不可更改的列表(R.id.details\u片段))
    .put(“竞争对手层”,不可变列表(R.id.switch_concorrentes))
    //(……等等。。。
    .build();
    
    我不鼓励使用双括号初始化。正如所解释的,它可能

  • 让你的同事感到惊讶,而且很难阅读
  • 损害性能
  • 可能导致对象相等性问题(创建的每个对象都有一个 唯一类对象)
  • 如果可能的话,我建议使用

    例如:

    public static final Map<String, List> ALL_PERMISSIONS =  ImmutableMap.<String, List>of(
            "Change-maps", ImmutableList.of(R.id.button_change_view),
            "Stores-info-view", ImmutableList.of(R.id.details_fragment),
            "Competitors-layer", ImmutableList.of(R.id.switch_concorrentes)
    );
    
    public static final Map ALL_PERMISSIONS=ImmutableMap.of(
    “更改地图”,不可变列表(R.id.按钮更改视图),
    “存储信息视图”,不可变列表(R.id.details\u片段),
    “竞争对手层”,不可变列表(R.id.switch\u concorrentes)
    );
    
    或者,如果需要添加更多元素:

    public static final Map<String, List> ALL_PERMISSIONS =  new ImmutableMap.Builder<String, List>()
            .put("Change-maps", ImmutableList.of(R.id.button_change_view))
            .put("Stores-info-view", ImmutableList.of(R.id.details_fragment))
            .put("Competitors-layer", ImmutableList.of(R.id.switch_concorrentes))
            //(... and so on...
            .build();
    
    public static final Map ALL_PERMISSIONS=new ImmutableMap.Builder()
    .put(“更改地图”,不可变列表(R.id.button\u Change\u view))
    .put(“存储信息视图”,不可更改的列表(R.id.details\u片段))
    .put(“竞争对手层”,不可变列表(R.id.switch_concorrentes))
    //(……等等。。。
    .build();
    
    好像你遗漏了
    某个地方…只要仔细检查大括号。好像你遗漏了
    某个地方。。。只要仔细检查支架。