我已经玩弄了我的想法。如果没有任何迭代,我想不出一种方法来做到这一点。
假设您有一个名为distance(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);
}
如果您使用JDK8 Preview,您可以使用上面的代码立即执行此操作。Iterables.getFirst() 方法不会迭代整个集合,而只会迭代满足条件的第一个元素。
否则,您可能必须实现 Predicate 接口和过滤方法。
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;
}
或者,您可以在找到满足您条件的第一个项目后停止过滤。