Java 如何更新lambda函数外部声明的变量值?
今天遇到以下代码,它将输入的秒长转换为Java 如何更新lambda函数外部声明的变量值?,java,lambda,java-8,Java,Lambda,Java 8,今天遇到以下代码,它将输入的秒长转换为2days、3hours、1min、5s等格式。我的问题是使用final long[]secondsCpy={seconds}。lambda中的任何变量都必须是final或有效final,因此,使用数组变量是一种攻击。有更好的方法吗 private static final LinkedHashMap<String, Long> readableTimeFormatMap = new LinkedHashMap<String, Lo
2days、3hours、1min、5s等格式。我的问题是使用final long[]secondsCpy={seconds}代码>。lambda中的任何变量都必须是final或有效final,因此,使用数组变量是一种攻击。有更好的方法吗
private static final LinkedHashMap<String, Long> readableTimeFormatMap = new LinkedHashMap<String, Long>() {
{
put("day", TimeUnit.DAYS.toSeconds(1));
put("hr", TimeUnit.HOURS.toSeconds(1));
put("min", TimeUnit.MINUTES.toSeconds(1));
put("sec", TimeUnit.SECONDS.toSeconds(1));
}
};
public static String getReadableTime(final long seconds) {
final StringJoiner readableTime = new StringJoiner(" ");
final long[] secondsCpy = { seconds };
readableTimeFormatMap.forEach((displayString, divider) -> {
readableTime.add(getReadableTimeUnit(displayString, secondsCpy[0] / divider));
secondsCpy[0] = secondsCpy[0] % divider;
});
return readableTime.toString().trim();
}
私有静态最终LinkedHashMap readableTimeFormatMap=new LinkedHashMap(){
{
put(“日”,时间单位为天到秒(1));
put(“hr”,时间单位为小时到秒(1));
输入(“分钟”,时间单位。分到秒(1));
put(“秒”,时间单位。秒到秒(1));
}
};
公共静态字符串getReadableTime(最后的长秒){
最终细木工可读时间=新细木工(“”);
最终长[]秒scpy={seconds};
readableTimeFormatMap.forEach((显示字符串,分隔符)->{
add(getReadableTimeUnit(displayString,secondsCpy[0]/divider));
secondsCpy[0]=secondsCpy[0]%除法器;
});
返回readableTime.toString().trim();
}
没有更好的方法可以做到这一点,例如,您可以很好地使用而不会使事情复杂化,您可以始终使用增强的for循环
long secondsCpy = seconds;
for (Map.Entry<String, Long> entry : map.entrySet()) {
readableTime.add(getReadableTimeUnit(entry.getKey(), secondsCpy / entry.getValue()));
secondsCpy = secondsCpy % entry.getValue();
}
long secondsCpy=秒;
对于(Map.Entry:Map.entrySet()){
add(getReadableTimeUnit(entry.getKey(),secondsCpy/entry.getValue());
secondsCpy=secondsCpy%entry.getValue();
}
使用map
和collect
组合从lambda返回任何值,而不是使用foreach
-->这样就不需要任何最终变量!您甚至不需要secondsCpy
,因为在这个方法中,seconds
将不用于任何其他内容。@霍尔格在问题中您可以看到,seconds
是最后一个变量,因此需要进行复制。是的,我们也可以使用它,但想看看是否可以使用lambda函数来完成。谢谢@Kermi或删除该final
修饰符。无论如何,它没有实际意义(除了需要第二个变量)。