Java 找到使用流生成地图的更好方法

Java 找到使用流生成地图的更好方法,java,java-stream,Java,Java Stream,我有这个枚举: public enum FieldType { INTEGER { @Override Set<Class<?>> getTypes() { return new HashSet<>(Arrays.asList(int.class, Integer.class)); } }, LONG { @Overr

我有这个枚举:

public enum FieldType
{
    INTEGER
    {
        @Override
        Set<Class<?>> getTypes()
        {
            return new HashSet<>(Arrays.asList(int.class, Integer.class));
        }
    },
    LONG
    {
        @Override
        Set<Class<?>> getTypes()
        {
            return new HashSet<>(Arrays.asList(long.class, Long.class));
        }
    };
    // More types...

    private static final Map<Class<?>, FieldType> _fieldTypes;

    static
    {
        _fieldTypes = Stream.of(values()).
            flatMap(ft -> ft.getTypes().stream()).
            collect(toMap(t -> t,
                t -> Stream.of(values()).
                filter(ft -> ft.getTypes().contains(t)).
                findAny().
                get()
            ));
    }

    abstract Set<Class<?>> getTypes();

    // More methods...
}
公共枚举字段类型
{
整数
{
@凌驾
Set>getTypes()
{
返回新的HashSet(Arrays.asList(long.class,long.class));
}
};
//更多类型。。。
私有静态最终映射>getTypes();
//更多方法。。。
}
如您所见,我在这个枚举中有一个映射,它将类型映射到字段类型。我设法使用streams在静态块中填充此映射。这是可行的,但我认为也许有一种更好、更简洁的方法。我可以将toMap方法的第二个参数放在一个新方法中,但我认为我只是将复杂性转移到了其他地方


对于如何以简单的方式实现同样的目标,您有什么建议吗?

您可以在flatmapping时将其输入到
条目中:

_fieldTypes = Stream.of(values())
    .flatMap(ft -> ft.getTypes().stream() // for every Class<?> of a FieldType...
        .map(cls -> new SimpleEntry<>(cls, ft))) // get Entry<Class<?>, FieldType>
    .collect(toMap(Entry::getKey, Entry::getValue));

在进行平面映射时,您可以将框放入
条目中

_fieldTypes = Stream.of(values())
    .flatMap(ft -> ft.getTypes().stream() // for every Class<?> of a FieldType...
        .map(cls -> new SimpleEntry<>(cls, ft))) // get Entry<Class<?>, FieldType>
    .collect(toMap(Entry::getKey, Entry::getValue));

简单一点怎么样:

Map<Class<?>, FieldType> map = Arrays.stream(FieldType.values())
                .flatMap(ft -> ft.getTypes().stream()
                      .map(cl -> new AbstractMap.SimpleEntry<>(cl, ft)))
                .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

Map简单一点怎么样:

Map<Class<?>, FieldType> map = Arrays.stream(FieldType.values())
                .flatMap(ft -> ft.getTypes().stream()
                      .map(cl -> new AbstractMap.SimpleEntry<>(cl, ft)))
                .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

Map@Novaterata“命名约定将是字段类型,因为它是静态的和最终的。”有争议。这是
静态定语
,但它不是一成不变的。@Marcos我认为(非常)普遍的习惯远远超过了书本上的建议或个人喜好。但这只是我的观点…@Marcos我一直使用缺少
}
表明这条路线在继续。@Novatata至少有一个相当知名的软件社区,它在@Marcos技术上提出了不变性的要求,是的,这是一个品味问题。但是,如果您希望其他人阅读或维护您的代码,遵循公认的约定通常是一个好主意。@Novatata“命名约定将是字段类型,因为它是静态和最终的。”有争议。这是
静态定语
,但它不是一成不变的。@Marcos我认为(非常)普遍的习惯远远超过了书本上的建议或个人喜好。但这只是我的观点…@Marcos我一直使用缺少
}
表明这条路线在继续。@Novatata至少有一个相当知名的软件社区,它在@Marcos技术上提出了不变性的要求,是的,这是一个品味问题。但是,如果您希望其他人阅读或维护您的代码,遵循公认的惯例通常是一个好主意。您可以提到
收集,然后
创建一个不可修改的映射。听起来不错。我只需要创建一个私有的SimpleEntry类。@Eugene Nice。我不知道。@Marcos它在JDK中,您可以使用:
import java.util.AbstractMap.SimpleEntry
@bradimus谢谢,我添加了它。你可以提到
收集,然后
创建一个不可修改的地图。听起来不错。我只需要创建一个私有的SimpleEntry类。@Eugene Nice。我不知道。@Marcos它在JDK中,您可以使用:
import java.util.AbstractMap.SimpleEntry@bradimus谢谢,我加的。