在Java中传入运算符

在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

我想通过传递操作符来减少代码,但我不确定如何做到这一点。例如,在下面的两个函数中,除了小于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];
    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));