今天遇到以下代码,它将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();
}
答案 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();
}