2

次のように定義された一連の関数があります。

public void foo1(int a, int b){
    if (a > b){
        c++;
    }
}


public void foo2(int a, int b){
    if (a > b && b = 7){
        c++;
    }
}


public void foo3(int a, int b){
    if (a >= b){
        c++;
    }
}

a と b の条件のみが異なります。条件を変数として設定できる 1 つの関数としてこれらを含める方法はありますか? それとも似たようなもの?

編集:これは些細な例であることに注意してください。関数に条件を渡すことが可能かどうか知りたいです

4

6 に答える 6

7

一般的な解決策として、インターフェースを定義できます。

public interface Predicate {
    public boolean eval(int a, int b);
}

次に、関数を定義します。

public void foo(Predicate predicate, int a, int b) {
    if (predicate.eval(a, b)) {
        c++;
    }
}

次に、さまざまなPredicateオブジェクトを定義できます。

Predicate test1 = new Predicate() {
    @Override
    public boolean eval(int a, int b) {
        return a >= b;
    }
};
// etc.

に適切な方を渡しfoo()ます。

または、 typeパラメーターとして使用するCallableインターフェースの使用を検討することもできます。Boolean(ただし、引数を取ることはできないため、パターンに正確に適合しません。)

于 2012-04-22T04:39:29.657 に答える
2

すべての条件を組み合わせた次のような関数を 1 つ持つことができます。

public void foo(int a, int b) {
    if (a >= b && b == 7) {
        c++;
    }
}
于 2012-04-22T04:34:52.030 に答える
1

頭に浮かんだ最初の解決策は、実際には

public void foo(int a, int b, boolean condition){
    if (condition){
        c++;
    }
}

呼び出しは条件を渡す「ように見えます」:

foo( a, b, a>b );
foo( a, b, a > b && b = 7 );
foo( a, b, a>=b );

実際には条件付きテストの結果を渡していますが、多くの場合、それで十分です。

シンプルで、他の誰も言及していないようだったので、ここに追加するだけです。

于 2012-04-22T05:41:42.137 に答える
0

@Nikharは正しいです。これに対処しながら混乱を解決するためにできることのひとつは、このようなOR演算子を使用することです。

function foo( int a, int b ) {
 if ( ( a > b ) || (a > b && b = 7) || (a >= b) ) // if any of the condition is true then
    c++;  // increment it
}
于 2012-04-22T04:42:11.463 に答える
0

次のようなインターフェースを持つことができます

public interface MyCondn{
  boolean check(int a, int b);
}

それで、

public void foo(MyCondn cond, int a, int b){

   if(cond.check(a,b))
      c++;
}

条件を次のように定義できます。

public class Foo1 implements MyCondn{
   boolean check(int a, int b){
      return a > b;
   }
}

その後、

classInsatnce.foo(new Foo1(), a,  b);
于 2012-04-22T04:44:36.393 に答える
0

関数をパラメーター (この場合は述語) として渡すことは、Java がラムダを取得すると簡単に実装できますが、これまでは非常に冗長な匿名の内部関数を使用して実装できました。たとえば、あなたが求めているものは、次のようなタイプセーフで一般的な方法で実装できます。

public class Test {

    private int c = 0;

    public void foo(Predicate<Integer, Integer> pred) {
        if (pred.condition()) {
            c++;
        }
    }

    public static void main(String[] args) {

        Test t = new Test();
        int a = 10;
        int b = 7;

        t.foo(new Predicate<Integer, Integer>(a, b) {
            @Override
            public boolean condition() {
                return a > b;
            }
        });

        t.foo(new Predicate<Integer, Integer>(a, b) {
            @Override
            public boolean condition() {
                return a > b && b == 7;
            }
        });

        t.foo(new Predicate<Integer, Integer>(a, b) {
            @Override
            public boolean condition() {
                return a >= b;
            }
        });

    }

}

abstract class Predicate<S, T> {
    S a;
    T b;
    Predicate(S a, T b) {
        this.a = a;
        this.b = b;
    }
    public abstract boolean condition();
}
于 2012-04-22T04:56:02.487 に答える