我一直在寻找具有以下代码的方法:
public boolean checkSomethingForCollection(Collection<Something> things){
for(Something thing:things){
boolean satisfiesCondition = check(thing);
if(satisfiesCondition){
return true;
}
}
return false;
}
private static boolean check(Something something){
//omitted...
}
我充分意识到公共方法将通过达到“返回”而停止。如果check(..)返回true,但它对我来说仍然看起来很难看。
最好的是什么?使用休息;而只是一个回归,或重构其他东西?具有
if(booleanExpression){
return true;
}
让我生病了。
答案 0 :(得分:6)
你不能用&#34; java为每个&#34;做到这一点,但你可以用这样的法线避免它:
boolean satisfiesCondition = false;
for (int i = 0; i < size && !satisfiesCondition; ++i) {
satisfiesCondition = check(things[i]);
}
return satisfiesCondition;
答案 1 :(得分:5)
Java 8中的Java流使这变得非常简单 - 采用谓词的Stream.anyMatch
方法完全你想要的东西。在这种情况下,您可以使用方法引用从check()
方法创建谓词。
public boolean checkSomethingForCollection(Collection<Something> things) {
return things.stream().anyMatch(this::check);
}
这是一个简短但完整的例子:
import java.util.*;
public class Test {
private final int minLength;
private Test(int minLength) {
this.minLength = minLength;
}
public boolean checkAny(Collection<String> things) {
return things.stream().anyMatch(this::check);
}
private boolean check(String x) {
return x.length() >= minLength;
}
public static void main(String[] args) throws Exception {
Test t = new Test(5);
List<String> shortStrings = Arrays.asList("asd", "bcd", "foo");
List<String> mixedStrings = Arrays.asList("asd", "bcd", "this is long", "foo");
System.out.println(t.checkAny(shortStrings)); // false
System.out.println(t.checkAny(mixedStrings)); // true
}
}
答案 2 :(得分:1)
答案 3 :(得分:0)
由于for
使用了迭代器,您可以选择使用while
循环:
Iterator<Something> iter = things.iterator();
boolean isValid= false;
while(iter.hasNext() && !isValid)
isValid = check(iter.next());
return isValid;
话虽如此,我认为您当前的版本更具可读性。