根据多个选项检查值

时间:2014-11-28 10:29:32

标签: java search collections

这不是一个问题,而是一个我愿意分享的想法。

有时我会遇到一种情况,我想根据一小组可能的匹配来检查一个值。

我们假设我们有一个名为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提案?如果没有,应该有吗?还有其他方法可以解决这个问题吗? 我真的在这里寻找人群中的智慧,看看这样的事情是好是坏,还是以前曾经想到过。

0 个答案:

没有答案