You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Java Stream实现条件生成列表且避免重复调用方法

Java Stream优化:避免重复调用方法并实现预期输出

当前代码存在两个核心问题:

  1. 第一个Stream通过filter过滤掉了null结果,导致原列表中的Test2被丢弃,无法得到预期输出
  2. 注释中的代码虽然能返回正确结果,但会两次调用getRealName()方法,造成不必要的性能开销

解决方案1:Lambda内缓存计算结果

在map操作的Lambda中先调用一次getRealName()并缓存结果,再根据结果选择返回值,彻底避免重复调用:

List<String> result = list.stream()
    .map(altName -> {
        String realName = getRealName(altName);
        return realName != null ? realName : altName;
    })
    .collect(Collectors.toList());

解决方案2:用Optional简化逻辑

借助Optional的orElse()方法,用一行代码实现需求,同样只调用一次getRealName():

List<String> result = list.stream()
    .map(altName -> Optional.ofNullable(getRealName(altName)).orElse(altName))
    .collect(Collectors.toList());

额外性能优化:反转HashMap减少查询耗时

原getRealName()方法通过遍历HashMap Entry查询,时间复杂度为O(n)。可以预先反转HashMap,将value作为key存储,把查询效率提升至O(1):

public class Main {
    private static HashMap<String, String> myMap = new HashMap<>();
    // 预先创建反转映射,将value映射到对应key
    private static Map<String, String> reverseNameMap;

    public static void main(String[] args) {
        myMap.put("Test11", "Test1");
        myMap.put("Test33", "Test3");
        myMap.put("Test44", "Test4");
        // 初始化反转映射
        reverseNameMap = myMap.entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));

        List<String> list = new ArrayList<>();
        list.add("Test1");
        list.add("Test2");
        list.add("Test3");
        list.add("Test4");

        // 结合方案2的Stream实现
        List<String> result = list.stream()
                .map(altName -> Optional.ofNullable(getRealName(altName)).orElse(altName))
                .collect(Collectors.toList());

        System.out.println(result); // 输出[Test11, Test2, Test33, Test44]
    }

    private static String getRealName(String item) {
        return reverseNameMap.get(item);
    }
}

内容的提问来源于stack exchange,提问作者AAPJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:27:27