一、出现原因
在日常的业务开发中,我们经常遇到如下的代码块(代码示例1),在该代码块中,RowMapper的中跟真正跟业务有关的代码只有return resultSet.getString("CD_CAPACITY");, 哪有什么代码可以忽略无关的代码呢?Lambda表达式就解决了这一块问题,可将该代码块修改为代码示例2.
代码示例1:
List<String> capacities = jdbcTemplate.query(valueSql, new RowMapper<String>() { @Override public String mapRow(ResultSet resultSet, int i) throws SQLException { return resultSet.getString("CD_CAPACITY"); } });
代码示例2:
List<String> capacities = jdbcTemplate.query(valueSql, (resultSet, i) -> resultSet.getString("CD_CAPACITY"));
所以,Lambda表达式出现的主要原因就是编程中代码质量的控制,忽略与业务无关的代码。
二、基本概念
Lambda表达被称为箭头函数、匿名函数、闭包,体现的是轻量级函数式编程思想,运行于JDK1.8以上的java环境,遵循理论是MCAD(Model Code As Data)编程模式,编程即数据,尽可能轻量级的将代码封装为数据,实现方式通常以接口&&实现类(或匿名内部类)的方式。
三、基本语法
List<String> capacities = jdbcTemplate.query(valueSql, (resultSet, i) -> resultSet.getString("CD_CAPACITY"));
Lambda表达式函数体包含四部分,分别是声明、参数、操作、执行的代码块。
声明:与Lambda表达式绑定的操作类型,即List<String> capacities。
参数:需要传入代码块的参数,即(resultSet, i),参数类型不需要指定,Lamda会自动推导。
操作:箭头函数 ->
执行代码块:即resultSet.getString("CD_CAPACITY"));
四、函数式接口
(1)概念:函数式接口是java8中新定义的一种接口,与java中传统Interface接口声明相同,代码如示例3,特点:
1. 含有一个抽象方法
2. 基于java8的特性,可以有静态方法
3. 可以含默认实现的方法
4. 可以通过@FunctionalInterface接口标识检测
代码示例3:
@FunctionalInterface public interface FunctionalDemo { void test(); }
(2)函数式接口与Lambda表达式关系:
1. Lambda表达式操作时只能操作一个方法,而函数式接口只存在一个抽象方法,两者相同。
2. 在实际应用中,Lambda表达式就是函数式接口的匿名实现的简写。
(3)JDK8中提供的常用函数式接口,存在于JDK的java.util.Functiona包下:
1. Predicate<T> 接收参数类型T, 返回一个Boolean类型
2. Comsumer<T> 接收参数类型T, 无返回结果
3. Function<T, R> 接收参数类型T, 返回参数类型R
4. Supplier<T> 不接受参数, 返回一个T类型对象, 类似创建工厂
5. UnaryOperator<T> 接收参数类型T,返回对象T
6. BinaryOperator<T> 接收两个T对象,返回一个T
更多接口可以去查阅JDK文档