【问题标题】:is there a Java equivalent to Javascript's "some" method?是否有与 Javascript 的“某些”方法等效的 Java?
【发布时间】:2012-02-17 22:54:28
【问题描述】:

我有一个集合,我想知道至少一个元素是否满足某些条件。本质上,some 在 JavaScript 中所做的,我想在一个集合上做!

【问题讨论】:

    标签: java javascript collections guava


    【解决方案1】:

    从 Java 8 开始,您可以将 Collection 转换为 Stream 并使用 anyMatch,如下例所示。

    import java.util.Arrays;
    import java.util.List;
    
    public class SomeExample {
        public static void main(String[] args) {
            List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, -6, 7);
            boolean hasNegative = list.stream().anyMatch(x -> x < 0);
            if (hasNegative) {
                System.out.println("List contains some negative number");
            }
            else {
                System.out.println("List does not contain any negative number");
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      查看GuavaIterables 类及其any() 实现。

      与另一个答案中的 Commons Collections 示例大致相同,但已通用化:

      List<String> strings = Arrays.asList("ohai", "wat", "fuuuu", "kthxbai");
      boolean well = Iterables.any(strings, new Predicate<String>() {
          @Override public boolean apply(@Nullable String s) {
              return s.equalsIgnoreCase("fuuuu");
          }
      });
      System.out.printf("Do any match? %s%n", well ? "Yep" : "Nope");
      

      【讨论】:

      • +1 缺乏泛型是 commons 集合的主要缺点。
      • @Anony-Mousse 是的;这很痛苦,虽然我仍然使用它:/
      【解决方案3】:

      您可以使用来自 Apache 的 CollectionUtils commons-collections

      List<Integer> primes = Arrays.asList(3, 5, 7, 11, 13)
      CollectionUtils.exists(primes, even);  //false
      

      even 是谓词:

      Predicate even = new Predicate() {
          public boolean evaluate(Object object) {
              return ((Integer)object) % 2 == 0;
          }
      }
      

      或内联版本:

      List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13)
      CollectionUtils.exists(primes, new Predicate() {
          public boolean evaluate(Object object) {
              return ((Integer)object) % 2 == 0;
          }
      });
      

      是的,它丑的有两个原因:

      1. Java (尚)不支持作为一等公民的函数,这些函数通过 Single-Abstract-Method 接口进行模拟。
      2. commons-collections 不支持泛型。

      另一方面,在 Scala 等现代 JVM 语言中,您可以编写:

      List(3,5,7,11,13,17).exists(_ % 2 == 0)
      

      【讨论】:

      • 另一个支持这种方法的第三方库是Google Guava,它有Iterables.any()
      • 而且 Guava 支持泛型。 ;)
      • Java 8 将具有 lambda。此外,SAM 类现在称为功能接口。
      【解决方案4】:

      Java 没有内置此功能。 Javascript's some() 接受函数指针作为参数,这不是 Java 本身支持的。但是使用循环和回调功能的接口在 Java 中模拟 some() 的功能应该是相当直接的。

      【讨论】:

      • 它接受一个函数,但这和函数指针不是一回事。
      猜你喜欢
      • 2014-04-06
      • 2013-06-03
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 1970-01-01
      相关资源
      最近更新 更多