Brn*_*rns 1 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;
};
Run Code Online (Sandbox Code Playgroud)
这是有效的代码(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!");
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我没试过,但我认为这应该有效:
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);
Run Code Online (Sandbox Code Playgroud)
UPDATE
@Holger提出了另一个我认为值得一提的解决方案:
return enumWords.stream()
.mapToInt(word -> m1.get(word).compareTo(m2.get(word)))
.filter(i -> i != 0)
.findFirst()
.orElse(0);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
105 次 |
| 最近记录: |