我正在寻找从 bean 列表中的枚举属性列表计算最高序数枚举值。
例如,我有:
@Data
public class MyBean {
private Priority priority;
}
and
public enum Priority {
URGENT("Urgent"),
HIGH("High"),
MEDIUM("Medium"),
LOW("Low");
@Getter
private final String value;
Priority(String value) {
this.value = value;
}
@Override
public String toString() {
return getValue();
}
}
如果我有一个List
of MyBeans
,我怎样才能找到bean的最大序数值priority
在列表中?
例子:
{myBean1, myBean2, myBean3, myBean4} where
myBean1.getPriority() = Priority.LOW
myBean2.getPriority() = Priority.URGENT
myBean3.getPriority() = Priority.HIGH
myBean4.getPriority() = null
returns Priority.URGENT
我认为最坏的情况是我可以迭代values()
在枚举中以Collections.min(Arrays.asList(Priority.values()));
并循环遍历每个 bean 以查看值是否匹配。但这似乎很乏味。
您可以使用 Stream API,尤其是max(Comparator)
方法来查找具有最高优先级的 bean。
注意:您的枚举具有相反顺序的优先级。在我的示例中,我将假设相反的情况以使代码更加不言自明。转变max
for min
and nullsFirst
with nullsLast
,如果您不重新排列枚举。
Bean highest = beans.stream()
.max(Comparator.comparing(Bean::getPriority,
Comparator.nullsFirst(Comparator.comparing(Priority::ordinal))))
.orElse(null);
return highest.getPriority();
如果只需要优先级,可以简化:
return beans.stream()
.map(Bean::getPriority)
.filter(Objects::nonNull)
.max(Comparator.comparing(Enum::ordinal))
.orElse(null);
其工作原理如下:
- 仔细观察每一粒豆子
- 优先考虑
- 丢弃空优先级
- 选择最高优先级
- 注意列表为空或所有优先级为空
注意:我的例子非常冗长。 shmosel(已删除)的答案表明您可以通过以下方式自然地对枚举进行排序ordinal
,制作更好的比较器。 Comparator.comparing(Enum::ordinal)
就可以成为Comparator.naturalOrder()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)