我玩弄了我如何做的想法,我无法想出不做任何迭代的办法来做到这一点。
假设您有名为 距离( String, String):int
的方法, 返回两个字符串之间的给定距离 。
String x = "Obi-wan"; //this is the item subject to eval addition
List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin"));
if (items.filter(s -> distance(s, x) >= 3).getFirst() == null) {
items.add(x);
}
如果您使用 < a href=" "http://jdk8.java.net/lambda/" rel="nofollow" >JDK8 Preach , 您可以在不使用精确的上面代码的情况下做到这一点。 Iterables. getFirst () 方法不会将整个收藏复制, 但直到找到第一个符合标准的元素为止 。
否则您可能不得不执行预设接口和过滤方法。
interface Predicate<T> {
public boolean eval(T o);
}
public static void main(String[] args) {
final String x = "Obi-wan"; //this is the item subject to eval addition
List<String> items = new ArrayList<String>(asList("Luke","Yoda","Anakin"));
Predicate<String> p = new Predicate<String>() {
public boolean eval(String s){
return distance(s, x) >= 3;
}
};
if(filter(items, p).isEmpty()){
items.add(x);
}
}
public static <T> List<T> filter(List<? extends T> items, Predicate<? super T> predicate){
List<T> destiny = new ArrayList<T>();
for(T item : items){
if(predicate.eval(item){
destiny.add(item);
}
}
return destiny;
}
或者,一旦发现第一个符合标准的项目,你可以停止过滤。