避免if(condition)返回true的优选方法

时间:2015-09-23 11:35:12

标签: java

我一直在寻找具有以下代码的方法:

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;
}

让我生病了。

4 个答案:

答案 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)

我还没有检查过代码,但您应该可以执行以下操作:

things.stream()
    .filter(x -> check(x))
    .findFirst()

您可以找到更多信息here

答案 3 :(得分:0)

由于for使用了迭代器,您可以选择使用while循环:

Iterator<Something> iter = things.iterator();
boolean isValid= false;
while(iter.hasNext() && !isValid)
    isValid = check(iter.next());

return isValid;

话虽如此,我认为您当前的版本更具可读性。