2017-11-11 84 views
0

我想通過傳入運算符來減少代碼,但我不知道如何執行此操作。例如,在下面的兩個功能,都具有相同的代碼只是一個不到VS大於號傳入Java中的運算符

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

我在想一個解決方案,以減少代碼將創建一個名爲可執行文件,聲明方法的接口執行(int a,int b)返回一個布爾值。 然後我可以創建兩個實現,一個執行<,另一個執行>。喜歡的東西:

private int find(int[] a, Executable myOp){ 
    int cur =a[0]; 
    for (int val : a){ 
     if (myOp.execute(val,cur)){ 
      cur=val; 
     } 
    } 
} 
private int findMax(int[] a){ 
    GreaterThan g = new GreaterThan(); 
    find(a, g) 
} 
    private int findMin(int[] a){ 
    LessThan g = new LessThan(); 
    find(a, g) 
} 

*其中GREATERTHAN和每種不超過執行可執行

我承認這是我的例子完全是不必要的,但我可以看到更復雜的例子,其中將是有益的改變創造額外的功能單一「操作」。我是如何描述處理我的困境的標準方法還是我應該考慮的其他事情?

回答

0

是我描述了接近我的困境的標準方式,還是我應該考慮的其他事情?

您提出的實現方式將被最好地描述爲一種「老式」的方式。你所提出的基本上是在細粒度層面上實現(手動)的Strategy design pattern

在Java 8(及其以後)中,執行此操作的標準方法是使用Stream API並將lambda表達式或類似語言實現爲「運算符」。基礎設施已經存在,所以沒有必要重新發明它。

即使您要實現的內容不能很好地映射到由流提供的編程的功能樣式,仍然可以使用Java 8 lambda表達式和函數接口來編寫您的「運算符」並將它們傳遞給您的(假設的)非流式算法。

1

Java已經提供了一種機制,通過該機制,您可以使用Comparator執行此操作。我制定了方法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)); 
} 

我也得到

[1, 2, 3] 
min: 1 
max: 3 
0
int min = Arrays.stream(a).min().getAsInt(); 
int max = Arrays.stream(a).max().getAsInt(); 
0

你想要的已經做了什麼更普遍的版本:

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)); 

等等

繼續前進,寫一個函數,找到最低限度,如果你打電話給它很多,但我不會打擾聰明的普及版本,因爲Stream API已經涵蓋了這些用例。