java lambda filter实现元素过滤与变量作用域、生命周期
最开始只是拿来用,后来调试研究了一下。
解释:2 传递的是对象,对象中包含 keySet 变量,每次调用都是这个对象里面的 keySet 变量。
而 1 每次都是创建了一个新的对象,keySet 自然不同,也就不能实现过滤了
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;
class Scratch {
public static void main(String[] args) {
Stream.generate(() -> 1)
.limit(25)
// .distinct()
.filter(i -> {
ConcurrentHashMap.KeySetView<Object, Boolean> keySet = ConcurrentHashMap.newKeySet();
return keySet.add(i);
})// 1. 此处过滤无用
.filter(distinctByKey(Function.identity()))// 2. 此处过滤有用,原因就是两个 keySet 变量的作用域与生命周期不同
.forEach(System.out::println);
// 解释:2 传递的是对象,对象中包含 keySet 变量,每次调用都是这个对象里面的 keySet 变量。
// 而 1 每次都是创建了一个新的对象,keySet 自然不同,也就不能实现过滤了
System.out.println(distinctByKey(t -> 1));
}
static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
ConcurrentHashMap.KeySetView<Object, Boolean> keySet = ConcurrentHashMap.newKeySet();
return t -> keySet.add(keyExtractor.apply(t));
}
}
Lambda 学会调用 API 并不难,难的是掌握好其中变量的生命周期、作用域。
本文来自博客园,作者:康舒服冰红茶,转载请注明原文链接:https://www.cnblogs.com/pong137/p/17567113.html
欢迎转载,但请注明「作者」和「原文地址」。转载请在文中保留此段,感谢您对作者版权的尊重。如需商业转载或刊登,请联系作者获得授权。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?