【发布时间】:2012-02-17 22:54:28
【问题描述】:
我有一个集合,我想知道至少一个元素是否满足某些条件。本质上,some 在 JavaScript 中所做的,我想在一个集合上做!
【问题讨论】:
标签: java javascript collections guava
我有一个集合,我想知道至少一个元素是否满足某些条件。本质上,some 在 JavaScript 中所做的,我想在一个集合上做!
【问题讨论】:
标签: java javascript collections guava
从 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");
}
}
}
【讨论】:
查看Guava 的Iterables 类及其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");
【讨论】:
您可以使用来自 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;
}
});
是的,它是丑的有两个原因:
commons-collections 不支持泛型。另一方面,在 Scala 等现代 JVM 语言中,您可以编写:
List(3,5,7,11,13,17).exists(_ % 2 == 0)
【讨论】:
Iterables.any()。
Java 没有内置此功能。 Javascript's some() 接受函数指针作为参数,这不是 Java 本身支持的。但是使用循环和回调功能的接口在 Java 中模拟 some() 的功能应该是相当直接的。
【讨论】: