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谢谢,我加的。