java - 从常量构建静态 map

标签 java java-8 java-stream

我遇到了这种情况,我不确定为什么会发生这种情况,也许你可以帮助我。

我有一个具有这种结构的类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() 是非静态的。

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

谢谢!

最佳答案

终于我让它发挥作用了。创建该 map 的正确方法是

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

我不明白为什么编译器会提示静态方法。

关于java - 从常量构建静态 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40224699/

相关文章:

java - Android Button vs TextView - 超链接行为

java - 扫描仪在使用 next() 或 nextFoo() 后跳过 nextLine()?

java - 如何在 Java 中创建采用优先级列表进行比较的比较器?

java - Collectors.groupingBy 两列不起作用

java - 并行流的 Stream.spliterator 的奇怪行为

java - 在 Android 上的 java 中检测内存泄漏

java - 使 JComponent 适合/缩放到正在打印的页面

java - 将格式 "yyyy-mm-ddTHH:MM:SS+/-0000"的日期转换为 "yyyy-mm-ddTHH:MM:SSZ"

java - 重用部分流映射和过滤来组成两个不同的结果

java-8 - 使用Java 8流修改列表中对象的属性值