如何使用Java Stream实现条件生成列表且避免重复调用方法
Java Stream优化:避免重复调用方法并实现预期输出
当前代码存在两个核心问题:
- 第一个Stream通过
filter过滤掉了null结果,导致原列表中的Test2被丢弃,无法得到预期输出 - 注释中的代码虽然能返回正确结果,但会两次调用
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
相关产品推荐
相关产品推荐

