java~lambda表达式让查询更优雅
在java之前的版本里,如果希望从集合时查找符合条件的数据,如果先遍历他,这种写法是我们不能接受的,所以现在java有了lambda就很好的解决了这个问题,让代码更优雅一些!
Predicate
/** * lambda filter. * @param list * @param predicate * @return */ public List<User> conditionFilter(List<User> list, Predicate<User> predicate){ return list.stream().filter(predicate).collect(Collectors.toList()); }
上面的方法里有个predicate委托,他类似C++里的函数指针,和C#里的委托类似,他允许外面将一个表达式传进来,与现有代码很好的结偶了!
/** * find list. */ public void findList() { List<User> list = new ArrayList<>(); list.add(new User("zzl")); list.add(new User("abc")); list.add(new User("bca")); list = conditionFilter(list, exe -> exe.getName() == "zzl"); for (User user : list ) { System.out.println(user.getName()); } }
上面代码在集合里查找了名字为zzl的记录!
下面让委托实现了不等于的查找!
/** * lambda filter not. * * @param subjects * @param predicate * @return */ private List<User> conditionFilterNot(List<User> subjects, Predicate<User> predicate) { return subjects.stream().filter(predicate.negate()).collect(Collectors.toList()); }
事实上,java里的Predicate接口还有很多用法,想and,or也有支持!
Consumer
consumer允许外界传入一个有参数但没有返回值的方法原型,这在C#里类似于Action委托,在java里就是函数式接口的一个特例,人家java为咱们封装了一下,开发人员可以直接用这个函数式
接口了,它的原码如下:
@FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } }
我们在平时使用时,比如可以写个日志方法,而日志通过哪种方式持久化我们可能不确定,这时就可以使用Consumer来实现
private void logger(Consumer<String> action, String msg) { action.accept(msg); } @Test public void lambda() { logger(i -> System.out.println(i), "hello"); }
在调用传入打印方法时,就把日志打到控制台上,而如果调用方将Slf4j的日志方法传入时,就以这种方法写日志。
@Test public void lambdaLog() { logger(i -> logger.info(i), "hello"); }
参考资料:
http://ifeve.com/predicate-and-consumer-interface-in-java-util-function-package-in-java-8/
https://docs.oracle.com/javase/8/docs/api/java/util/function/Predicate.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
2014-04-24 MVVM架构~使用boxy和knockoutjs实现编辑功能
2012-04-24 System.Web.Caching.Cache删除某键后,希望同时触发其它动作(关键时刻,还是事件靠的住)