如何更新lambda函数外部声明的变量值?

时间:2018-04-18 14:41:41

标签: java lambda java-8

今天遇到以下代码,它将Long中的输入秒转换为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();
    }

2 个答案:

答案 0 :(得分:3)

没有更好的方法可以使用,例如AtomicLong

答案 1 :(得分:2)

没有复杂的事情,你总是可以使用增强的for循环。

long secondsCpy = seconds;
for (Map.Entry<String, Long> entry : map.entrySet()) {
    readableTime.add(getReadableTimeUnit(entry.getKey(), secondsCpy / entry.getValue()));
    secondsCpy = secondsCpy % entry.getValue();
}