不同条件下的java相似函数

不同条件下的java相似函数,java,conditional-statements,Java,Conditional Statements,我有一组定义如下的函数: 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++; } }

我有一组定义如下的函数:

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++;
    }
}
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();
}
只在a和b的条件上有所不同。有没有一种方法可以将它们包含为一个函数,我可以将条件设置为一个变量?还是类似的


编辑:请注意,这是一个简单的示例,我想知道是否可以将条件传递给函数

您可以有一个这样的函数,它组合了所有条件:

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

对于通用解决方案,您可以定义一个接口:

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 test1 = new Predicate() {
    @Override
    public boolean eval(int a, int b) {
        return a >= b;
    }
};
// etc.
并将适当的一个传递给
foo()


或者,您可以考虑使用
Boolean
作为类型参数来使用接口。(但是,它不能接受参数,因此它并不完全符合您的模式。)

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

你可以有一个像这样的界面

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

您可以将条件定义为

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

classInsatnce.foo(new Foo1(), a,  b);

一旦Java获得lambdas,将函数作为参数(在本例中是谓词)传递将很容易实现,直到现在,它们可以使用非常详细的匿名内部函数来实现。例如,您所要求的可以用类型安全的通用方式实现,如下所示:

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++;
    }
}
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();
}
公共类测试{
私有int c=0;
公共void foo(谓词pred){
if(pred.condition()){
C++;
}
}
公共静态void main(字符串[]args){
测试t=新测试();
INTA=10;
int b=7;
t、 foo(新谓词(a,b){
@凌驾
公共布尔条件(){
返回a>b;
}
});
t、 foo(新谓词(a,b){
@凌驾
公共布尔条件(){
返回a>b&&b==7;
}
});
t、 foo(新谓词(a,b){
@凌驾
公共布尔条件(){
返回a>=b;
}
});
}
}
抽象类谓词{
S a;
tb;
谓词(sa,tb){
这个a=a;
这个.b=b;
}
公共抽象布尔条件();
}

想到的第一个解决方案实际上是

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 );
您实际上通过了条件测试的结果,但在许多情况下,这已经足够好了


只是在这里添加它,因为它很简单,似乎没有人提到它。

你是说JavaScript?如果是这样,请更改标记。在java中,方法定义不是以
函数开始的
,它看起来像
public void foo(类型t1,类型t2)
。是的,我知道,快速键入。一点也不影响问题,但已更新。这是一个微不足道的示例,抱歉。我的意思是,有没有办法将条件传递给函数?@Ted我不熟悉堆栈溢出,您是如何将此代码区域更改为代码块格式的,缩进4个空格。您也可以高亮显示它,然后单击
{}
按钮。(你可以通过点击编辑区右上角的
按钮来了解这一切。)+0你剽窃了泰德的作品answer@Bohemian考虑到你的代表,我想你知道人们可能会同时写答案。而且,你一定不知道剽窃的含义。我没有抄袭,你说话的方式需要改进。祝你一切顺利。