zoukankan      html  css  js  c++  java
  • 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文档

  • 相关阅读:
    Kafka项目实战-用户日志上报实时统计之编码实践
    MapReduce-深度剖析
    Word 页码设置教程:如何删除封面和目录的目录?
    Pytorch autograd,backward详解
    Pytorch Sampler详解
    Pytorch并行计算:nn.parallel.replicate, scatter, gather, parallel_apply
    论文笔记系列-Auto-DeepLab:Hierarchical Neural Architecture Search for Semantic Image Segmentation
    Pytorch: parameters(),children(),modules(),named_*区别
    Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?
    如何理解正定矩阵和半正定矩阵
  • 原文地址:https://www.cnblogs.com/zhexuejun/p/14452220.html
Copyright © 2011-2022 走看看