这不是一个问题,而是一个我愿意分享的想法。
有时我会遇到一种情况,我想根据一小组可能的匹配来检查一个值。
我们假设我们有一个名为value
的字符串变量和选项文字"match1"
,"match2"
和"match3"
目前有几种方法可以做到这一点,第一种是使用简单的if语句:
// Putting the literal first to prevent NullPointerExceptions
if ("match1".equals(value) || "match2".equals(value) || "match3".equals(value)) { // do something }
这对我来说太可怕了,尤其是如果选项数量增加的话。我发现它不可读且不可行。
实现此目的的另一种方法是使用switch
:
switch (value) {
case "match1":
case "match2":
case "match3":
// do something
break;
default:
break;
}
同样,这并不理想,我不太喜欢switch语句,因为它们看起来像一个奇怪的遗留代码组合(使用标签和gotos)和现代的东西。然而,最大的缺点可能是仅适用于字符串,整数和枚举。
我可以在传递可变数量的匹配参数的时候使用这种自定义泛型方法:
@SafeVarargs
public static <T> boolean hasMatch(final T value, final T... options) {
if (options == null || value == null) {
return false;
}
return Arrays.asList(options).contains(value); // uses equals to match items
}
这对我有用,我可以这样称呼它:hasMatch(value, "match1", "match2", "match3");
我仍觉得它很难看,但Java 8为我们提供了流的力量:
@SafeVarargs
public static <T> boolean hasMatch(final T value, final T... options) {
if (options == null || value == null) {
return false;
}
return Arrays.stream(options).anyMatch(Predicate.isEqual(value));
}
这看起来与之前的解决方案非常相似,只是语法上的不同。
理想情况下,语言中会有一些内容可以解决此问题,例如in
关键字,所以我可以这样做:
if (value in {"match1", "match2", "match3"})
是否有针对此的JSR提案?如果没有,应该有吗?还有其他方法可以解决这个问题吗? 我真的在这里寻找人群中的智慧,看看这样的事情是好是坏,还是以前曾经想到过。