黑马程序员技术交流社区

标题: [石家庄校区] Lambda表达式 [打印本页]

作者: heifachangcun    时间: 2018-11-26 14:54
标题: [石家庄校区] Lambda表达式
函数式编程思想: Lambda表达式
函数式编程思想概述
函数式:
在数学中, 函数就是有输入量, 输出量的一套计算方案, 也就是"传入什么东西, 得到什么结果"  y = f(x)
面向对象与函数式的区别:
面向对象: 强调"用哪个对象的哪个方法"来做事 (注重语法形式: 继承 方法重写)
函数式: 强调"传入的参数 和 要执行的代码"
函数式编程的好处:
简化代码编写 (使用 λ Lambda表达式, 简化匿名内部类的代码)
Lambda标准格式
Lambda表达式的3个部分:
  1. 一些参数 ():接口中抽象方法的参数列表. 没参数就空着; 有参数就写, 多个参数用逗号分隔
  2. 一个箭头 ->  :将参数传递给方法体
                3. 一段代码 {} :重写接口抽象方法的方法体
格式:
// 写成多行
(数据类型 变量名, 数据类型 变量名) -> {
一些重写方法的代码
                    一些重写方法的代码
                           ...
}
// 如果代码只有一行, 也可以合并写成一行
(参数列表) -> {一些重写方法的代码}
例子:
// 对数组排序
            // 匿名内部类方式
    /*Arrays.sort(arr, new Comparator<Person>() {
      @Override
      public int compare(Person o1, Person o2) {
        return o1.getAge() - o2.getAge();
      }
    });*/
    // Lambda标准格式
    Arrays.sort(arr, (Person o1, Person o2) -> {
      return o1.getAge() - o2.getAge();
   });
            // 打印排序后的结果
    for (Person person : arr) {
      System.out.println(person);
   }
函数式接口:
函数式接口: "有且仅有一个抽象方法的接口"
但函数式接口对于 哪些方法算作抽象方法 有特殊规定:
1. 有方法体的方法"不算作"抽象方法, 如默认方法, 静态方法, 私有方法
2. 如果一个抽象方法 与 java.lang.Object类中的方法 定义相同的, 也"不算作"抽象方法
因为任何实现本接口的实现类, 都会直接或间接继承java.lang.Object类的public的方法, 所以在创建实现类时其实不用重写该抽象方法, 也就不算作抽象方法
Lambda省略格式和使用前提
省略原则:
"可推导的都可省略" (凡是能根据前后代码能猜测出来的代码, 都可以省略不写)

  可以省略的部分:
                            1. (参数列表): 参数"类型"可以省略 (a, b) -> {}
                            2. (参数列表): 如果参数只有1个, 则"类型"和"小括号"都可以省略  a -> sout(a)
                            3. {一些代码}: 如果只有一条代码, 则"大括号", "return", "分号"省略必须"一起省略"


Lambda表达式的使用前提:
                          1. Lambda只能用于接口, 且"接口中有且仅有一个抽象方法"(也称为"函数式接口")
                                                   普通类, 抽象类不能用
  2. 使用Lambda必须具有上下文推断
                                           接口中只能有一个抽象方法, 才能推断出来重写的是这个抽象方法






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2