Lambda方法引用
在lambda方法体中,有些功能已经实现了,就可以使用方法引用。
主要格式有以下几种:
1. 对 象 :: 实例方法名
import java.util.function.Function;
import java.util.function.Supplier;
/*
对 象 :: 实例方法名
*/
public class Demo001 {
public static void main(String[] args) {
//目的一: 返回一个String
//无参 有返回的 lambda返回值方法 可以使用Supplier接口
//原始写法
Supplier<String> s=()->{return ("Hello");};
//调用Supplier接口中的get()方法返回并打印
System.out.println("原始写法:"+s.get());
//方法引用写法
Supplier<String> s1=new Test()::getMsg;
//调用Supplier接口中的get()方法返回并打印
System.out.println("引用写法:"+s1.get());
//目的二:将helloWorld 重复指定次数,返回出去
//有参有返回值可以使用Function接口 R apply(T t)
//原始写法
Function<Integer,String> f=(num)->{
//创建StringBuilder对象存放字符串
StringBuilder sb=new StringBuilder();
for(int i=0;i<num;i++){
//添加字符串
sb.append("helloWorld ");
}
//返回String 类型字符串
return sb.toString();
};
System.out.println("打印一:");
System.out.println(f.apply(5));
//方法引用写法
Function<Integer,String> f1=new Test()::copyN;
System.out.println("打印二:");
System.out.println(f1.apply(5));
}
}
class Test{
// 方法的功能返回一个String 无参有返回值
public String getMsg(){
//返回值
return "Hello.";
}
//将helloWorld 重复指定次数,返回出去 有参 有返回值
public String copyN(int num){
//创建StringBuilder对象存放字符串
StringBuilder sb=new StringBuilder();
for(int i=0;i<num;i++){
//添加字符串
sb.append("helloWorld ");
}
//返回String 类型字符串
return sb.toString();
}
}
2. 类 :: 静态方法名
import java.util.Comparator;
/*
类 :: 静态方法名
*/
public class Demo003 {
public static void main(String[] args) {
int a=100;
int b=20;
//手动比较
if(a>b){
System.out.println(1);
}else if(a<b){
System.out.println(-1);
}else{
System.out.println(0);
}
System.out.println("-----------------");
//Integer中compare方法比较
System.out.println(Integer.compare(a,b));
System.out.println("------------------");
//Comparator接口lambda比较
Comparator<Integer> c=(x,y)->{return x>y?1:(x<y?-1:0);};
System.out.println("原始写法打印:"+c.compare(a, b));
//调用Integer中的静态方法compare
Comparator<Integer> c1=Integer::compare;
System.out.println("新写法打印:"+c1.compare(a,b));
}
}
3.类::实例方法名
import java.util.function.BiPredicate;
/*
类::实例方法名
*/
public class Demo004 {
public static void main(String[] args) {
// 判断两个String数据是否相等
String s1="abc";
String s2="abc";
//实例方法调用非静态方法
//
System.out.println(s1.equals(s2));
//调用BiPredicate接口中的test方法 有参有返回值
//原始写法
BiPredicate<String,String> b=(x1,x2)->{
return x1.equals(x2);
};
System.out.println("原方法打印:"+b.test(s1,s2));
//新写法
BiPredicate<String, String> b1=String::equals;
System.out.println("新方法打印:"+b1.test(s1,s2));
}
}
4.构造器引用
类::new
/*
类::new
*/
public class Demo005 {
public static void main(String[] args) {
//创建个人对象
Person p=new Person("张水水");
//打印信息
p.printInf();
//自定义接口函数,原始写法
MyFunIn<Person,String> m=(name)->{return new Person(name);};
System.out.println(m.get("赵敏"));
//自定义接口函数,新写法
MyFunIn<Person,String> m1=Person::new;
System.out.println(m1.get("张无忌"));
}
}
@FunctionalInterface
interface MyFunIn<T,E>{
T get(E str);
}
//Person类
class Person{
private String name;
public Person() {
}
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public void printInf(){
System.out.println(toString());
}
}
注意:需要调用的构造器的参数列表要与函数式接口中抽象方法参数列表保持一致。