私はそれをどのように行うかという私の考えで遊んできました。何回も繰り返さずにこれを行う方法を考えることはできません。
distance(String,String):int
2つの文字列間の指定された距離を返すという名前のメソッドがあるとします。
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プレビューを使用する場合は、上記のコードを使用してすぐにこれを行うことができます。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;
}
または、基準を満たす最初のアイテムが見つかったら、フィルタリングを停止することもできます。