答案 0 :(得分:8)
一种方法是将if
s链转换为增强型for
循环:
for (String kind : new String[] {"ladies", "kids", "men", "home"}) {
if (onlineAreaPrioList.contains(kind)) {
dominantOnlineArea = kind;
break;
}
}
考虑将“魔术字符串”(即"ladies"
,"kids"
,"men"
和"home"
)替换为在适当级别定义的字符串常量。
另一种方法是将“魔术字符串”替换为enum
s,这样您就可以将onlineAreaPrioList
的类型切换为EnumSet
:
public enum PriorityKind {
LADIES, KIDS, MEN, HOME
}
...
EnumSet<PriorityKind> onlineAreaPrioList = new EnumSet<>();
答案 1 :(得分:5)
实际上将它们保留为String
可能不是一个好主意,因为您需要明确优先级。因此,定义Enum
可能会更好:
enum Priority {
LADIES(1),
KIDS(2),
MEN(3),
HOME(4);
private final int weight;
Priority(int weight) {
this.weight = weight;
}
public int getWeight() {
return weight;
}
}
然后用法是:
Stream.of(Priority.KIDS, Priority.MEN)
.max(Comparator.comparing(Priority::getWeight))
.orElse(null);
答案 2 :(得分:3)
另一种选择是使用Stream API,它可以产生更优雅的解决方案:
dominantOnlineArea = Stream.of("ladies", "kids", "men", "home")
.filter(onlineAreaPrioList::contains)
.findFirst()
.orElse(null); // handle the empty case as you wish