不同条件下的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考虑到你的代表,我想你知道人们可能会同时写答案。而且,你一定不知道剽窃的含义。我没有抄袭,你说话的方式需要改进。祝你一切顺利。