java - 将代码转换为 lambda

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

最佳答案

我没试过,但我认为这应该可行:

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

关于java - 将代码转换为 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651241/

相关文章:

java - Oracle:确定支持的最大连接数

javascript - 在 Internet Explorer 中使用 selenium 的 JavascriptExecutor 打开一个新选项卡

java - jcmd 创建的堆转储文件在哪里?

C#:有没有办法使用 lambda 表达式设置集合中对象的属性?

java - 如何收集DoubleStream到List

java - 单例工厂方法

c# - 为什么开放类型 Predicate<T> 比它的对应类型慢

Java lambda 不适用于完整定义

java - "Your java version is out of date"带有最新的java

Java 8 : Stream, NIO 和 Lambda