学习基于记录,而不止于记录。
希望自己能坚持下去~
0.写在前面
java 版本:1.8.0_181
开发工具:IntelliJ IDEA 2018.3.2 (Ultimate Edition)
总结Java8 方法和构造器引用的基本用法。
1.1概念
方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。
注意方法引用是一个Lambda表达式,其中方法引用的操作符是双冒号::
。
2.方法引用
2.1对象::实例方法名
代码:
package methodconstructorreference;
import java.io.PrintStream;
import java.util.function.Consumer;
/**
* @Author: grj
* @Date: 2020/5/18 21:17
* 方法引用和构造器引用
*/
public class TestLambda3 {
public static void main(String[] args) {
test1("对象::实例方法名,方法引用测试!");
}
/*
对象::实例方法名
*/
public static void test1(String s) {
// Consumer<String> consumer = (i) -> System.out.println(i);
PrintStream ps = System.out;
Consumer<String> consumer = ps::println;
consumer.accept(s);
}
}
结果:
注意:
实现抽象方法的参数列表,必须与方法引用方法的参数列表保持一致!
2.2类::静态方法
代码:
package methodconstructorreference;
import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.Consumer;
/**
* @Author: grj
* @Date: 2020/5/18 21:17
* 方法引用和构造器引用
*/
public class TestLambda3 {
public static void main(String[] args) {
test2(6,3);
}
/*
类::静态方法
*/
public static void test2(Integer a, Integer b) {
// Comparator<Integer> comparator = (x,y) -> Integer.compare(x,y);
Comparator<Integer> comparator = Integer::compare;
System.out.println("比较结果:"+comparator.compare(a,b));
}
}
结果:
2.3类::实例方法
代码:
package methodconstructorreference;
import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
/**
* @Author: grj
* @Date: 2020/5/18 21:17
* 方法引用和构造器引用
*/
public class TestLambda3 {
public static void main(String[] args) {
test3("hello","hello world!");
}
/*
类::实例方法
*/
public static void test3(String str1, String str2) {
// BiPredicate<String, String> biPredicate = (x,y) -> x.equals(y);
BiPredicate<String, String> biPredicate = String::equals;
System.out.println("断言结果:" + biPredicate.test(str1,str2));
}
}
结果:
3.构造器引用
代码:
package methodconstructorreference;
import java.io.PrintStream;
import java.util.Comparator;
import java.util.function.*;
/**
* @Author: grj
* @Date: 2020/5/18 21:17
* 方法引用和构造器引用
*/
public class TestLambda3 {
public static void main(String[] args) {
test4();
}
/*
构造器引用
*/
public static void test4() {
// Supplier<Animal> supplier = () -> new Animal();
Supplier<Animal> supplier1 = Animal::new;
System.out.println("Animal:"+supplier1.get());
BiFunction<String, String, Animal> biFunction = Animal::new;
System.out.println("Anima2:"+biFunction.apply("黄色","小猫"));
}
}
package methodconstructorreference;
/**
* @Author: grj
* @Date: 2020/5/19 21:14
*/
public class Animal {
String color;
String name;
public Animal() {
}
public Animal(String color, String name) {
this.color = color;
this.name = name;
}
@Override
public String toString() {
return "Animal{" +
"color='" + color + '\'' +
", name='" + name + '\'' +
'}';
}
}
结果:
注意:
入参不同调用的构造器方法也不相同。
4.总结
注意参数列表是否和引用的方法和构造器形参相匹配。