Java在循环中中使用lambda需要注意项
lambda表达式在jvm运行时会转换成Class进而生成其对象
先说结论:
在写lambda表达式时,若使用到上下文中的值且值不是final修饰的基础类型和字符串时, 则程序每次执行到lambda时都会新生成一个对象
测试代码:
lambda表达式中未使用上下文变量,lambda生成的对应地址一样
// lambda表达式中未使用上下文变量,lambda生成的对应地址一样
Map<Integer, List<String>> map = new HashMap<>(16);
for (int i = 0; i < 10; i++) {
Function<Integer, List<String>> function = (k) -> {
List<String> list = new ArrayList<>();
return list;
};
System.out.println("address: " + function);
map.computeIfAbsent(i, function);
}
lambda表达式中使用final修饰的基础类型变量,String, lambda不会每一次都生成新的对象
Map<Integer, List<String>> map = new HashMap<>(16);
// lambda表达式中使用final修饰的基础类型变量,String lambda不会每一次都生成新的对象
final int size = 10;
final String str = "sss";
for (int i = 0; i < 10; i++) {
Function<Integer, List<String>> function = (k) -> {
List<String> list = new ArrayList<>(size);
list.add(str);
return list;
};
System.out.println("address: " + function);
map.computeIfAbsent(i, function);
}
lambda表达式中使用上下文中中使用final修饰其他对象包括包装类都会每次生成新的对象
Map<Integer, List<Object>> map = new HashMap<>(16);
// 基本类型封装类使用
// final int size = 10;
// final String str = "sss";
final Integer integer = Integer.parseInt("12");
final Object o = new Object();
for (int i = 0; i < 10; i++) {
Function<Integer, List<Object>> function = (k) -> {
List<Object> list = new ArrayList<>(integer);
// list.add(str);
// list.add(o);
list.add(integer);
return list;
};
System.out.println("address: " + function);
map.computeIfAbsent(i, function);
}
参考文档:https://cloud.tencent.com/developer/article/1572212?ivk_sa=1024320u