他的回复:
华为云ID: breakin123 第三周笔记+读书心得第五章 面向对象之函数式编程5.1 函数式编程背景: 在数学中,函数就是有输入量输出量的一套计算方案,即“拿什么东西,做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法,强调做什么,而不是以什么形式做。本质: 真正的目的——传递一段代码。解决方法:从JDK8之后可使用新增的lamda表达式,这种表达式只针对有一个抽象方法的接口实现,以简洁的表达式形式实现接口功能来作为方法参数5.2 函数式接口函数式接口定义:有且只有一个抽象方法的接口,接口上标注有@FunctionalInterface注解(这个注解显式的标注了接口是一个函数式接口,并强制编辑器进行更严格的检查,确保该接口是函数式接口)Lambda表达式基本语法格式: (参数列表)-> {表达式主体}(1)参数列表:用来向表达式主体内部实现的接口方法传入参数。多个参数之间用逗号分隔,可以省略数据类型,只有一个参数时还可以省略小括号(2)->:Lambda表达式箭牌,用来指定参数数据指向,不能省略(3)表达式主体:本质就是接口中抽象方法的具体实现。如果只有只有一条语句,可以省略分号、省略大括号,在lambda表达式主体中只有一条return语句时,也可以省略return关键字lambda表达式代替匿名内部类的条件: 接口中仅有一个抽象方法,因为lambda表达式是基于函数式接口实现的。JDK8新增加的函数接口 -java.util.function包下包含了许多类,用来支持Java的函数式编程。5.3 方法引用当lambda表达式主体只有一条语句时,程序不仅可以可以省略包含主体的花括号,还可以通过英文双冒号“::”的语法格式来引用方法和构造器。作用:进一步简化lambda表达式,本质是对lambda表达式的主体部分已存在的方法进行直接引用。分类:(1)通过类名引用静态方法 例程如下://定义一个函数式接口@FunctionalInterfaceinterface Calcable { int calc(int num);} //定义一个类,并在类中定义一个静态方法class Math { //定义一个求绝对值的方法 public static int abs(int num) { if (num 0){ return -num; }else { return num; } }} //定义一个测试类public class Example1 { //下面这个方法的作用:将num灌进Calcable接口的方法中 private static void printAbs(int num, Calcable calcable) { System.out.println(calcable.calc(num)); } public static void main(String[] args) { //1. 使用匿名内部类的方式 printAbs(-8, new Calcable() { @Override public int calc(int num) { return Math.abs(num); } }); //2. 使用lambda表达式 printAbs(-8, (n) -> {return Math.abs(n);} ); //3. 简化上面的lambda表达式 printAbs(-8, (n) -> Math.abs(n) ); //4. 使用方法引用进一步简化上面的简化表达式 printAbs(-8, (n) -> Math::abs );}(2)通过对象名引用方法 定义:通过实例化对象的名称来对其方法进行的引用 引用方法跟上例程中类似,就是把“::”前的类名替换成对象名(3)通过构造器引用方法 定义:指对类自带的构造器的引用,例程如下//定义一个函数式接口@FunctionalInterfaceinterface PersonBuilder { Person buildPerson(String name);} //定义一个Person类,并添加有参构造方法class Person { private String name; public Person(String name) { this.name =name; } public String getName() { return name; }} //定义一个测试类public class Example2 { //PersonBuilder接口的实现类此时应该是 return new Person(name); private static void printName(String name, PersonBuilder builder) { System.out.println(builder.buildPerson(name).getName()); } public static void main(String[] args) { //1. 使用lambda表达式 printName(“张三”, (name) -> {return new Person(name);} ); //2. 简化上面的lambda表达式 printAbs(“张三”, name -> new Person(name) ); //3. 使用构造器引用进一步简化上面的简化表达式 printAbs(“张三”, Person::new);}