目录
第一节:方法引用与构造器引用基本概念
方法引用,其中包括构造器引用,因为构造器本身也是一个方法;
一、方法引用基本概念
1、为什么要使用方法引用
如果lambad体中的内容有方法已经实现了,我们可以使用方法引用,可以理解为方法引用是lambad表达式的另外一种表现形式;
二、方法引的三种格式
1、第一种方式
对象::实例方法名称
2、第二种方式
类名称::静态方法名称
3、第三种方式
类名称::实例方法名称
第二节:实例演示方法引用
一、演示对象::实例方法名称
1、演示案例1
1)、代码实现
package 方法引用与构造器引用;
import java.util.function.Consumer;
public class TestMethodRef1 { public static void test1() {
//未使用方法引用 Consumer<String> con1 = (x)->System.out.println(x); con1.accept("abc");
/** * 分析: * 在未使用方法引用的时候,lambad的实现体中,要做的事情是将输入的数据打印出来; * 他调用的是System.out获取到的输出流中的println方法; * 当在lambad要实现的抽象类中的方法参数列表和返回值与已有的某个方法一致的时候, * 并且要做的操作也是一样的时候,那么我们就可以使用方法引用; * 而这里使用的是实例对象::实例方法名称的方式进行调用; * 所以,可以将其改造成如下: */
//使用方法引用 Consumer<String> con2 = System.out::println; con2.accept("abc");
/** * 疑问:为什么这里将参数省略了?因为java8实现了很强大的参数推断, * 有些地方是可以省略参数不写的; */ } public static void main(String[] args) { test1(); } } |
2)、运行效果
abc abc |
2、演示案例2
1)、代码实现
package 方法引用与构造器引用;
import java.util.function.Consumer; import java.util.function.Supplier;
import 为什么要使用lambad表达式.entity.Employee;
public class TestMethodRef1 {
/** * 演示对象::实例方法名称2 */ public static void test2() { Employee emp = new Employee();
//未使用方法引用 Supplier<String> sup1 = ()->emp.getName(); String name = sup1.get(); System.out.println(name);
//使用方法引用 Supplier<Integer> sup2 = emp::getAge; Integer age = sup2.get(); System.out.println(age); }
public static void main(String[] args) { test2(); } } |
2)、运行效果
null 0 |
3、总结
这里要注意一点的是,你需要引入的方法的参数列表和返回值,以及实现内容,必须和lambad将要实现的抽象方法的参数列表、返回值和实现内容一致;
二、演示类名称::静态方法名称
1、代码实现
package 方法引用与构造器引用;
import java.util.Comparator; import java.util.function.Consumer; import java.util.function.Supplier; import 为什么要使用lambad表达式.entity.Employee;
public class TestMethodRef1 {
/** * 演示类::静态方法名称 */ public static void test3() { //未使用方法引用 Comparator<Integer> com1 = (x,y)->Integer.compare(x, y); System.out.println(com1.compare(13,12));
//使用方法引用 Comparator<Integer> com2 = Integer::compare; System.out.println(com2.compare(13,12)); } public static void main(String[] args) { test3(); } } |
2、运行效果
1 1 |
三、演示类名称::实例方法名称
1、代码实现
package 方法引用与构造器引用;
import java.util.Comparator; import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Supplier;
import 为什么要使用lambad表达式.entity.Employee;
public class TestMethodRef1 { /** * 演示类::实例方法名称 */ public static void test4() {
//未使用方法引用 BiPredicate<String,String> bp1 = (x,y)->x.equals(y); System.out.println(bp1.test("yb","fly"));
//使用方法引用 BiPredicate<String,String> bp2 = String::equals; System.out.println(bp2.test("yb","fly"));
} public static void main(String[] args) { test4(); }
} |
2、运行效果
false false |
3、总结
使用类名称::实例方法名称的方式,需要遵循一个原则,也就是说这种方式,需要满足一定的限制条件,即:参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数,这个时候便可以使用类名称::实例方法名称来实现方法的引用!
第三节:构造器引用
一、构造器引用的语法格式
其实他就是方法引用的一种变体,其语法格式为:类名称::new
二、实例演示构造器引用
1、代码实现
package 方法引用与构造器引用;
import java.util.Comparator; import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Supplier; import 为什么要使用lambad表达式.entity.Employee;
public class TestMethodRef1 { /** * 演示构造器引用 */ public static void test5() {
//未使用方法引用 Supplier<Employee> sup1 = ()->new Employee("杨保",18,5000); System.out.println(sup1.get());
//使用方法引用 Supplier<Employee> sup2 = Employee::new; System.out.println(sup2.get());
} public static void main(String[] args) { test5(); } } |
2、运行效果
Employee [name=杨保, age=18, salary=5000.0] Employee [name=null, age=0, salary=0.0] |
3、总结
这里需要注意的是,需要调用的构造器的参数列表,要与函数式接口中抽象方法的参数列表保持一致;
第四节:数组引用
一、数组引用的语法格式
类型::new
二、数组引用实例演示
1、代码实现
package 方法引用与构造器引用;
import java.util.Comparator; import java.util.function.BiPredicate; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; import 为什么要使用lambad表达式.entity.Employee;
public class TestMethodRef1 { /** * 实例演示数组引用 */ public static void test6() { //未使用数组引用 Function<Integer,String[]> fun1 = x->new String[x]; System.out.println(fun1.apply(10).length); //使用数组引用 Function<Integer,String[]> fun2 = String[]::new; System.out.println(fun2.apply(20).length);
} public static void main(String[] args) { test6(); } } |
2、运行效果
10 20 |
到这里,基本上方法的引用就讲完了,接下来我们来学习streamAPI,这可是好东西呢!