我有一个集合,想知道是否至少有一个元素满足某个条件。本质上,我想在集合上做的就是 JavaScript 中 some 方法所能实现的功能!
从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");
}
}
}
与其他答案中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");
CollectionUtils
: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;
}
});
是的,这很丑陋,原因有两个:
commons-collections
不支持泛型。另一方面,在现代JVM语言(如Scala)中,你可以这样写:
List(3,5,7,11,13,17).exists(_ % 2 == 0)
Iterables.any()
方法。 - axtavtJava没有内置此功能。Javascript的some()
接受函数指针作为参数,这不是Java本地支持的内容。但使用循环和回调功能的接口应该可以相对简单地模拟some()
的功能。