2017-03-07 216 views
1

我試圖將我的「長」代碼轉換爲更簡單的lambda驅動代碼。想法是從枚舉中獲取值。如果第一個值更高或更低,返回它並打破進一步的lambda。我不知道該從哪裏出發。 Lambda從枚舉返回代碼罰款,它計算差異罰款。我的問題是,一旦找到差異,就會讓值返回和/或打破進一步執行lambda。將代碼轉換爲lambda

碼不起作用:

BiFunction<Map<String, Integer>,Map<String, Integer>,Integer> biFunction = (m1, m2) -> { 
    enumWords.forEach(word -> { 
     Integer returnValue = 0; 
     if(m1.get(word) > m2.get(word)){ 
      returnValue = m1.get(word).compareTo(m2.get(word)); 
      break; 
     } 
    }); 
    return returnValue;  
}; 

這是代碼(預拉姆達),其工作:我還沒有嘗試

BiFunction<Map<String, Integer>,Map<String, Integer>,Integer> biFunction = (m1, m2) -> { 
      Integer returnValue = 0; 
      if(m1.get("Love") > m2.get("Love")){ 
       returnValue = -1; 
      }else if(m1.get("Love") < m2.get("Love")){ 
       returnValue = 1; 
      }else{ 
       if(m1.get("You") > m2.get("You")){ 
        returnValue = -1; 
       }else if(m1.get("You") < m2.get("You")){ 
        returnValue = 1; 
       }else{ 
        if(m1.get("Me") > m2.get("Me")){ 
         returnValue = -1; 
        }else if(m1.get("Me") < m2.get("Me")){ 
         returnValue = 1; 
        }else{ 
         if(m1.get("Forever") > m2.get("Forever")){ 
          returnValue = -1; 
         }else if(m1.get("Forever") < m2.get("Forever")){ 
          returnValue = 1; 
         }else{ 
          if(m1.get("Give") > m2.get("Give")){ 
           returnValue = -1; 
          }else if(m1.get("Give") < m2.get("Give")){ 
           returnValue = 1; 
          }else{ 
           System.out.println("Same lyrics!"); 
           } 
          } 
         } 
        } 
      } 
+0

取代'forEach',我會去使用'在流filter'的方法,然後後,你可以做'findFirst'哪一個返回'Optional '哪裏?是Stream類型。 (可選) opt = enumWords.stream()。filter(word - > m1.get(word)> m2.get(word)).map(m1.get(word).compareTo(m2.get(word) )).findFirst();' – Orin

+1

你的嘗試是矛盾的。你能發佈你的工作非lambda代碼來顯示你真正想要做什麼嗎?不幸的是,你的解釋也沒有幫助。唯一不解釋您的*嘗試解決方案*是「想法是從枚舉中獲取值」,但是沒有涉及到枚舉。那麼你的實際目標是什麼?在Enum中有 – Holger

+0

有關鍵詞,我要通過歌曲歌詞,如果第一個關鍵詞比另一首歌曲出現更多,它會在列表中「向上」。如果他們具有相同的第一個關鍵字的數量,那麼它會轉到第二個等等。問題在於它之前是硬編碼的,我想這樣做,所以即使有人改變枚舉詞也可以使用它。 – Brns

回答

5

,但我認爲這應該工作:

return enumWords.stream() 
    // filter when they are different 
    .filter(word -> m1.get(word) != m2.get(word)) 
    // stop search at first occurrence 
    .findFirst() 
    // compare and get the value 1 or -1 
    .map(word -> m1.get(word).compareTo(m2.get(word))) 
    // return the value or 0 in case is not found 
    .orElse(0); 

UPDATE

@Holger提出另一種解決方案,我認爲這值得一提:

return enumWords.stream() 
      .mapToInt(word -> m1.get(word).compareTo(m2.get(word))) 
      .filter(i -> i != 0) 
      .findFirst() 
      .orElse(0); 
+2

您可以通過將'compareTo'移到前面來簡化它:'enumWords.stream().mapToInt(word - > m1.get(word).compareTo(m2.get(word))).filter(i - >我!= 0).findFirst()。或埃爾斯(0)' – Holger

+0

謝謝你們,它的工作原理。 – Brns

+1

感謝@Holger,我認爲它也更有效率,每個'enumWords'元素只有一個'get'。 – freedev