将代码转换为lambda

时间:2017-03-07 14:47:15

标签: java lambda java-8

我正在尝试将我的“长”代码转换为更简单的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;     
};

这是有效的代码(pre-lambda):

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!");
                                }
                            }
                        }
                    }
            }

1 个答案:

答案 0 :(得分: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);

<强>更新

@Holger提出了另一个我认为值得一提的解决方案:

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