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
修饰符。无论如何,它没有实际意义(除了需要第二个变量)。