如何使用Java Lambda表达式改写基于Map的列表遍历筛选代码?
用Java Lambda/Stream API实现需求的写法
嘿,刚好可以用Java 8引入的Stream API配合Lambda表达式来简化这段代码,写法更简洁且可读性强,直接看示例:
首先是最简洁的版本:
import java.util.stream.Collectors; // 假设map1和numbers已经完成初始化 List<String> spelling = numbers.stream() .filter(map1::containsKey) // 过滤出map中存在对应键的元素 .map(map1::get) // 将符合条件的键映射为对应的值 .collect(Collectors.toList()); // 把结果收集成List
细节说明:
numbers.stream():把普通List转换成Stream流,开启后续的链式操作filter(map1::containsKey):这里用了方法引用,等价于Lambda表达式num -> map1.containsKey(num),作用是只保留map中存在对应键的num元素map(map1::get):同样是方法引用,等价于num -> map1.get(num),把每个num转换成它在map中对应的valuecollect(Collectors.toList()):把处理后的Stream元素收集成一个List(默认实现是ArrayList,和你原来的代码逻辑一致)
如果你想明确指定收集为ArrayList(避免默认实现可能的变化),可以改成这样:
List<String> spelling = numbers.stream() .filter(map1::containsKey) .map(map1::get) .collect(Collectors.toCollection(ArrayList::new));
这种写法属于声明式编程,相比原来的for循环,它更关注“要做什么”(过滤存在的键、映射值、收集列表),而不是“怎么去做”(手动循环、判断、添加元素),代码也更紧凑。
内容的提问来源于stack exchange,提问作者John Humanyun




