有一个Java相当于Javascript的“一些”方法吗?

时间:2012-01-24 17:18:21

标签: java javascript collections guava

我有一个集合,我想知道是否至少有一个元素符合某些条件。基本上,some在JavaScript中的作用,我想对集合做什么!

4 个答案:

答案 0 :(得分:18)

查看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 :(得分:4)

您可以使用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(尚未)支持作为一等公民的功能,这些公民使用单一抽象方法界面进行模拟。
  2. commons-collections不支持泛型。

  3. 另一方面,在现代JVM语言(如Scala)中,您可以编写:

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

答案 2 :(得分:4)

从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");
        }
    }
}

答案 3 :(得分:0)

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