【问题标题】:Build static map from constants从常量构建静态映射
【发布时间】:2016-10-24 18:05:13
【问题描述】:

我有这种情况,我不确定为什么会发生这种情况,也许你可以帮助我解决这个问题。

我有一个具有这种结构的类 MyClass。 (带有 getter 和 setter)

public class MyClass {

private String id;
private String title;
private boolean anyBoolean;

我添加了一些静态属性,比如我们

public class MyClass {

public static final Group CONS_1 = new Group("cons_1","Cons 1", false);
public static final Group CONS_2 = new Group("cons_2","Cons 2", true);

private String id;
private String title;
private boolean anyBoolean;

public MyClass(String id, String title, boolean anyBoolean) {
        this.id = id;
        this.title = title;
        this.anyBoolean = anyBoolean;
}

仅供参考,我没有使用枚举,因为我必须序列化所有属性,而使用枚举它只序列化名称。 后来我意识到最好有办法通过 ID 公开这些常量,例如

public static Map<String, MyClass> myMap;

我尝试了一种基本的方法,例如

static {
        myMap = new HashMap<>();
        myMap.put(CONS_1.getId(), CONS_1);
    }

显然,它奏效了。 但我想知道我是否可以使用 Stream 来做到这一点,比如

myMap = Stream.of(CONS_1, CONS_2).collect(Collectors.groupingBy(MyClass::getId));

但不起作用,因为 getId() 是非静态的。

所以我的问题是为什么第二种方法不起作用,因为两种方法看起来都一样?

谢谢!

【问题讨论】:

  • @niceman 哪一部分?
  • 为什么不使用EnumMap
  • 这与getId 不是static 无关。正如here 解释的那样,当存在其他类型错误时,编译器喜欢抱怨非静态方法。在您的情况下,groupingBy 返回Map&lt;…,List&lt;…&gt;&gt;

标签: java java-8 java-stream


【解决方案1】:

最后我让它工作了。创建该地图的正确方法是

myMap = Stream.of(CONS_1, CONS_2).collect(Collectors.toMap(MyClass::getId, Function.identity()));

我不明白为什么编译器抱怨静态方法。

【讨论】:

  • 注意:你可以写一个像m -&gt; m这样的'identity lambda',它比输入Function.identity()更短,如果初学者不太清楚的话。
  • 我一直更喜欢 m -&gt; m 路由而不是 Function.identity(),因为它不那么冗长。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多