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