Java在循环中中使用lambda需要注意项

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

posted @ 2022-04-24 14:10  我见青山应如是  阅读(527)  评论(0编辑  收藏  举报