在java中如何根据条件使要调用的函数有不同的功能?

myy1966 2017-03-29 09:59:29
例如要求很多组数的最大值或最小值,可以在循环里判断
if (cond == ‘max’)
求最大值
else (cond == ‘min’)
求最小值
这样每次循环都要执行一次判断,能不能在循环外判断一次cond,然后令function根据cond的值指向max函数或min函数,再在循环内调用function就可以了
...全文
574 7 打赏 收藏 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
myy1966 2017-03-30
  • 打赏
  • 举报
回复
引用 3 楼 capricio 的回复:
if (cond == max){ function.max();} //function是你自己写的类名 else if(cond == min){ function.min();} else后面不能直接写条件,而且,条件判断执行的代码用大括号包起来的习惯更好些
我的意思是如果是在数据很多,在循环内这样写就会造成程序每次都会判断cond,能不能在循环外判断一次cond,然后改变循环内调用的函数的功能,类似于C中可以这样写: boolean max(int x[]); boolean min(int x[]); void * function; if (cond == max) function = max; else function = min; for (i=0; i < n; ++) function(data[i])
capricio 2017-03-30
  • 打赏
  • 举报
回复
if (cond == max){ function.max();} //function是你自己写的类名 else if(cond == min){ function.min();} else后面不能直接写条件,而且,条件判断执行的代码用大括号包起来的习惯更好些
myy1966 2017-03-30
  • 打赏
  • 举报
回复
引用 6 楼 zs808 的回复:
Java默认是不支持将方法当做参数进行传递的,没有C中的方法指针的概念。 但是,可以通过其它的手段来实现类似的操作,举个例子:

public class App {

	//包装一个“带有两个参数的有返回值的方法”
	static interface Function<TResult, TArg1, TArg2> {
		TResult process(TArg1 arg1, TArg2 arg2);
	}

	//实现一些方法,模拟“方法指针”
	public enum OpForInt implements Function<Integer, Integer, Integer> {
		//加
		Add(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 + arg2;
			}

		}),
		//减
		Sub(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 - arg2;
			}

		}),
		//乘
		Mul(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 * arg2;
			}
		}),
		//除
		Dev(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 / arg2;
			}
		});

		//包装方法实现
		Function<Integer, Integer, Integer> _delegate;

		//调用包装的方法实现
		@Override
		public Integer process(Integer arg1, Integer arg2) {
			return _delegate.process(arg1, arg2);
		}

		private OpForInt(Function<Integer, Integer, Integer> delegate) {
			this._delegate = delegate;
		}
	}

	//处理,两个操作数,一个操作方法指针
	public static Integer process(Integer num1, Integer num2, OpForInt op) {
		return op.process(num1, num2);
	}

	public static void main(String[] args) {
		int num1 = 100;
		int num2 = 200;
		System.out.println(process(num1, num2, OpForInt.Add)); //加
		System.out.println(process(num1, num2, OpForInt.Sub)); //减
		System.out.println(process(num1, num2, OpForInt.Mul)); //乘
		System.out.println(process(num1, num2, OpForInt.Dev)); //除
	}
}
C#的实现就是类似的,不过加了层语法糖而已,包括lamba。。。
谢谢,我明白了,这种需求可以用interface实现。
zs808 2017-03-30
  • 打赏
  • 举报
回复
Java默认是不支持将方法当做参数进行传递的,没有C中的方法指针的概念。 但是,可以通过其它的手段来实现类似的操作,举个例子:

public class App {

	//包装一个“带有两个参数的有返回值的方法”
	static interface Function<TResult, TArg1, TArg2> {
		TResult process(TArg1 arg1, TArg2 arg2);
	}

	//实现一些方法,模拟“方法指针”
	public enum OpForInt implements Function<Integer, Integer, Integer> {
		//加
		Add(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 + arg2;
			}

		}),
		//减
		Sub(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 - arg2;
			}

		}),
		//乘
		Mul(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 * arg2;
			}
		}),
		//除
		Dev(new Function<Integer, Integer, Integer>() {
			@Override
			public Integer process(Integer arg1, Integer arg2) {
				return arg1 / arg2;
			}
		});

		//包装方法实现
		Function<Integer, Integer, Integer> _delegate;

		//调用包装的方法实现
		@Override
		public Integer process(Integer arg1, Integer arg2) {
			return _delegate.process(arg1, arg2);
		}

		private OpForInt(Function<Integer, Integer, Integer> delegate) {
			this._delegate = delegate;
		}
	}

	//处理,两个操作数,一个操作方法指针
	public static Integer process(Integer num1, Integer num2, OpForInt op) {
		return op.process(num1, num2);
	}

	public static void main(String[] args) {
		int num1 = 100;
		int num2 = 200;
		System.out.println(process(num1, num2, OpForInt.Add)); //加
		System.out.println(process(num1, num2, OpForInt.Sub)); //减
		System.out.println(process(num1, num2, OpForInt.Mul)); //乘
		System.out.println(process(num1, num2, OpForInt.Dev)); //除
	}
}
C#的实现就是类似的,不过加了层语法糖而已,包括lamba。。。
usecf 2017-03-30
  • 打赏
  • 举报
回复
可以先在外面获取cond的值,然后再循环里面给数组赋值的
myy1966 2017-03-29
  • 打赏
  • 举报
回复
引用 1 楼 dotnetstudio 的回复:
如果cond和循环中的对象没有关系,那当然可以放到循环外面
但是cond要决定循环中对数据进行怎样的操作啊,比如cond为max,那么循环内就要调用max(),cond为min,那么循环内就要调用min()。
KeepSayingNo 2017-03-29
  • 打赏
  • 举报
回复
如果cond和循环中的对象没有关系,那当然可以放到循环外面

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧