Lambda介绍<一>:概念及基本用法

一、出现原因   

  在日常的业务开发中,我们经常遇到如下的代码块(代码示例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文档

原文地址:https://www.cnblogs.com/zhexuejun/p/14452220.html