在Java中传入运算符
我想通过传递操作符来减少代码,但我不确定如何做到这一点。例如,在下面的两个函数中,除了小于vs大于符号外,这两个函数都有相同的代码在Java中传入运算符,java,Java,我想通过传递操作符来减少代码,但我不确定如何做到这一点。例如,在下面的两个函数中,除了小于vs大于符号外,这两个函数都有相同的代码 private int findMin(int[] a){ int min =a[0]; for (int val : a){ if (val<min){ min=val; } } } private int findMax(int[] a){ int max =a[0
private int findMin(int[] a){
int min =a[0];
for (int val : a){
if (val<min){
min=val;
}
}
}
private int findMax(int[] a){
int max =a[0];
for (int val : a){
if (val>max){
min=val;
}
}
}
*其中GreaterThan和lesstan实现可执行文件
我认识到这对于我的示例来说是完全不必要的,但是我可以看到更复杂的示例,在这些示例中,通过更改单个“操作”来创建额外的功能将是有益的。我描述的是解决我的困境的标准方法,还是我还需要考虑其他的东西? < p> java已经提供了一种机制,你可以使用它。我制作了方法
static
,因为它们不依赖于任何类数据,并且我添加了一个小的测试工具。它可能看起来像
private static int find(int[] a, Comparator<Integer> myOp) {
int cur = a[0];
for (int val : a) {
if (myOp.compare(val, cur) > 0) {
cur = val;
}
}
return cur;
}
private static int findMax(int[] a) {
return find(a, Comparator.naturalOrder());
}
private static int findMin(int[] a) {
return find(a, Comparator.reverseOrder());
}
public static void main(String[] args) {
int[] vals = { 1, 2, 3 };
System.out.println(Arrays.toString(vals));
System.out.println("min: " + findMin(vals));
System.out.println("max: " + findMax(vals));
}
您想要的更通用的版本已经完成:
int maxInArray = IntStream.of(array).reduce(Integer.MIN_VALUE, (acc,x) -> (acc>=x ? acc:x));
int sumOfArray = IntStream.of(array).reduce(0, (acc,x) -> acc+x));
int oddNumberCount = IntStream.of(array).reduce(0, (acc,x) -> (x&1)==1 ? acc+1 : acc));
等等
继续写一个函数,如果你要经常调用它,它会找到最小值,但我不会费心制作聪明的通用版本,因为流API已经涵盖了这些用例
是我所描述的解决我的两难困境的标准方法,还是我还需要考虑其他的东西? 你提议的实现方法最好用“老式”的方式来描述。您所建议的基本上是在细粒度级别上(手动)实现的
在Java8(及更高版本)中,实现这一点的标准方法是使用流
API,并将“运算符”实现为lambda表达式或类似的表达式。基础设施已经存在,因此没有必要重新发明它
即使您想要实现的东西不能很好地映射到streams提供的函数式编程风格,您仍然可以使用Java8Lambda表达式和函数接口来编写“操作符”,并将它们传递给(假设的)非流式算法
[1, 2, 3]
min: 1
max: 3
int min = Arrays.stream(a).min().getAsInt();
int max = Arrays.stream(a).max().getAsInt();
int maxInArray = IntStream.of(array).reduce(Integer.MIN_VALUE, (acc,x) -> (acc>=x ? acc:x));
int sumOfArray = IntStream.of(array).reduce(0, (acc,x) -> acc+x));
int oddNumberCount = IntStream.of(array).reduce(0, (acc,x) -> (x&1)==1 ? acc+1 : acc));