【问题标题】:Java in operatorJava in 运算符
【发布时间】:2011-11-15 11:25:20
【问题描述】:

第一百万次,我希望在 Java 中使用 IN 运算符,类似于 SQL 中的 IN 运算符。它可以作为编译器语法糖来实现。所以这个

if (value in (a, b, c)) {
}
else if (value in (d, e)) {
}

...真的很棒。事实上,上面的结构和这里相当冗长(并且不适合原语)的结构是一样的:

if (Arrays.asList(a, b, c).contains(value)) {
}
else if (Arrays.asList(d, e).contains(value)) {
}

或者像 intlong 和类似类型这样:

switch (value) {
  case a:
  case b:
  case c:
    // ..
    break;

  case d:
  case e:
    // ..
    break;
 }

或许还有更高效的实现方式。

问题:

这样的东西会成为 Java 8 的一部分吗?如果没有,我怎么能提出这样的建议?或者我现在可以使用任何等效的构造吗?

【问题讨论】:

  • 我认为番石榴应该包含相同的东西。
  • 你在 Groovy 中有这个,就像一个 Java++ :)
  • @Kico Lobo:很高兴知道。不幸的是,我不能使用 Groovy :-/
  • @Thomas Jungblut:你有指针吗? Guava 库很大……

标签: java syntactic-sugar jls in-operator


【解决方案1】:

使用op4j

Op.onListFor(a,b,c).get().contains(value);

使用相同的方法,您可以使用方法 in 创建一个辅助类 Is

class Is<T> {
    private T value;

    public Is( T value ) { this.value = value; }

    public boolean in( T... set ) {
        for( T item : set ) {
            if( value.equals( item ) ) {
                return true;
            }
        }

        return false;
    }

    public static <T> Is<T> is( T value ) {
        return new Is<T>( value );
    }
}

使用静态导入,您可以编写:

if(is(value).in(a,b,c)) {
}

【讨论】:

  • 太棒了!我只是想问一下是否有专门用于这种 DSL 的库!非常感谢
  • 有趣的是,Op4j 几乎没有被使用。例如,当您将下载量与 Lambda-J 的下载量进行比较时,
  • 是的,它是位于浏览器选项卡中的这些宝石之一,乞求使用,但不知何故,从来没有时间开始使用它...
  • 我添加了一个功能请求,将您建议的 Is 类添加到库中。 Are 对于if (are(val1, val2).allIn(a, b, c)) 来说可能也是一个很好的课程:sourceforge.net/apps/phpbb/op4j/viewtopic.php?f=2&t=15
【解决方案2】:

你可以写一个辅助方法来做。

public static <T> boolean isIn(T t, T... ts) {
    for(T t2: ts) 
      if (t.equals(t2)) return true;
    return false;
}

// later
if (isIn(value, a,b,c)) {

} else if (isIn(value, d,e)) {

}

【讨论】:

  • 没错,这是最简单的解决方法。我猜isIn方法也可以在番石榴中找到,某个地方...
  • 很高兴看到,实际上有一个用于这种辅助方法的库。查看新接受的答案
【解决方案3】:

collection literals 有一个非常古老的提议。

目前 Guava 中有 Sets.newHashSet,与 Arrays.asList 非常相似。

【讨论】:

  • 我确信我以前见过这样的东西。所以它不是项目硬币的一部分,对于 Java 8 也不是......但是有了这个,我可以写 [a, b, c].contains(value)。那是可以接受的。所以 Guava 解决方案不会那么冗长。我认为与Arrays.asList() 相比,HashSet 对于恒定、少量元素的开销不值得麻烦...
  • 小尺寸的两种集合类型的性能应该相似。问题是每次使用时都会创建它,尽管热点可能会对其进行优化。使用包含文字的集合文字变得微不足道。
【解决方案4】:

我怀疑 IN 运算符之类的东西是否可用,因为正如您自己指出的那样,已经有多种方法可以做到这一点(比如使用 switch)。

而且我认为 project-coin 和 J8 的需求清单已经满载,可以考虑这样的事情。

【讨论】:

  • 这就是我所担心的(J8 已经满载)。但是目前,没有什么比简单的IN 运算符更简洁地实际执行IN 运算符的工作了。开关非常冗长。 Arrays.asList(...) 包含可能是一个选项
  • 你是对的。也许,我的建议太过分了。我更喜欢 Hermal 对 Joshua Bloch 的关于拥有集合文字的提议的引用......
  • @Suraj Chandran:我同意:一种语言不应该支持太多的编程习惯,即使它使代码更短,它也会使语言和编译器更复杂。
【解决方案5】:

您正在寻找Java Community Process

【讨论】:

  • 谢谢,我知道 JCP。我也知道coin-dev 邮件列表。我怎样才能增加被听到的机会?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多