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
java~lambda表达式让查询更优雅的更多相关文章
- Java Lambda表达式入门[转]
原文链接: Start Using Java Lambda Expressions http://blog.csdn.net/renfufei/article/details/24600507 下载示 ...
- Java Lambda表达式初探
Java Lambda表达式初探 前言 本文受启发于Trisha Gee在JavaOne 2016的主题演讲Refactoring to Java 8. Java 8已经发行两年多,但很多人仍然在使用 ...
- Java Lambda表达式入门
Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...
- Java Lambda表达式教程与示例
Lambda表达式是Java 8中引入的一个新特性.一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类.lambda表达式的概念最初是在LISP编程语言中引入的. Java La ...
- Java Lambda表达式forEach无法跳出循环的解决思路
Java Lambda表达式forEach无法跳出循环的解决思路 如果你使用过forEach方法来遍历集合,你会发现在lambda表达式中的return并不会终止循环,这是由于lambda的底层实现导 ...
- 「Flink」使用Java lambda表达式实现Flink WordCount
本篇我们将使用Java语言来实现Flink的单词统计. 代码开发 环境准备 导入Flink 1.9 pom依赖 <dependencies> <dependency> < ...
- MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy
一.序言 众所周知,MybatisPlus在处理单表DAO操作时非常的方便.在处理多表连接连接查询也有优雅的解决方案.今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询. 由于视 ...
- java lambda表达式学习笔记
lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...
- Java lambda 表达式常用示例
实体类 package com.lkb.java_lambda.dto; import lombok.Data; /** * @program: java_lambda * @description: ...
随机推荐
- JFree图表
************************************************************************************* 使用JFree生成统计图片, ...
- stop_token.go
package engine import ( "bufio" "log" "os" ) type StopToke ...
- BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed
BZOJ_2788_[Poi2012]Festival_差分约束+tarjan+floyed Description 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: ...
- Python笔记 in 机器学习
Python3的函数实在太多了,在机器学习的过程中,总会一不留神就学到一个python的高效率用法,怕自己会忘记,所以更新在这篇随笔中. 更新至:2018.5.23 字符串str的前缀或者后缀识别 s ...
- Spring Cloud Feign的文件上传实现
在Spring Cloud封装的Feign中并不直接支持传文件,但可以通过引入Feign的扩展包来实现,本来就来具体说说如何实现. 原文:http://blog.didispace.com/sprin ...
- DDD「领域驱动设计」分层架构初探
前言 基于 DDD 传统分层架构实现. 项目 github地址:https://github.com/WuMortal/DDDSample 这个分层架构是工作中项目正在使用的分层架构,使用了一段时间发 ...
- 流程控制之if判断
目录 语法(掌握) if if...else if...elif...else 练习(掌握) 练习1:成绩评判 练习2:模拟登录注册 if的嵌套(掌握) 语法(掌握) if判断是干什么的呢?if判断其 ...
- 【重学计算机】操作系统D3章:存储管理
1. 存储管理的基本概念 逻辑地址:用户地址,从零开始编号 一维逻辑地址:(地址) 二维逻辑地址:(段号: 段内地址) 主存储器的复用方式 按分区:主存划分为多个固定/可变分区,一个程序占一个分区 按 ...
- 实现AutoMapper(1.0版本)
最近有个需求就是实体之间自动转换,网上肯定有很多现成的实现,不过还是自己写了一个,就当对java高级特性的一个熟悉的过程.这中间包含了泛型,反射,lamada表达式.对于想了解java高级特性的人来说 ...
- MongoDB之基本操作与日常维护
MongoDB基本操作 MongoDB的基本操作主要是对数据库.集合.文档的操作,包括创建数据库.删除数据库.插入文档.更改文档.删除文档.和查询文档. 操作 描述 show dbs 查看当前实例下的 ...