8.内建函数式接口
在方法引用的操作过程中,可以发现,不管如何操作,对于可能出现的函数式接口的方法最多只有4类:有参数有返回值、有参数无返回值、无参数有返回值、判断真假。所以为了简化开发者的定义以及操作的统一,从JDK1.8开始提供了一个新的开发包:java.util.function,在此包中提供了许多内置的函数式接口,下面通过具体的范例来解释4个核心函数式接口的使用。
提示:java.util.function包中存在有大量类似功能的其他接口。
在4个函数式接口内部除了指定的抽象方法之外,还提供了一些default或static方法。另外,在java.util.function包中的核心接口之上,也定义接收更多参数的函数式接口。
(1)功能型函数式接口:该接口的主要功能是进行指定参数的接收并且可以返回处理结果。
@FunctionalInterface
public interface Function<T,R>{ //定义功能型接口,设置参数与返回结果类型
public R apply(T t); //接收参数并返回处理结果
}
范例:使用功能型函数式接口
本次将引用String类中判断是否以指定字符串开头的方法:public boolean startsWith(String str)。
package cn.kuiba.util;
import java.util.function.*;
public class Main {
public static void main(String args[]){
//引用startsWith()方法,该方法将接收一个String型参数,并返回Boolean类型
Function<String,Boolean>function="**kuiba"::startsWith;
System.out.println(function.apply("**")); //调用方法
}
}
程序执行结果:
true
如果要使用功能型函数式接口,必须保证有一个输入参数并且有返回值,由于映射的是String类的startsWith()方法,所以此方法使用时必须传入参数(String型),同时要返回一个判断结果(boolean型)。
(2)消费型函数式接口:该接口主要功能是进行参数的接收与处理,但是不会有返回结果。
@FunctionalInterface
public interface Consumer<T>{ //消费型函数式接口,只需设置参数类型即可
public void accept(T t); //接收一个参数,并且不需要返回处理结果,适合于引用类型操作
}
范例:使用消费型函数式接口
本次将引用System.out.println()方法进行内容输出。
package cn.kuiba.util;
import java.util.function.*;
public class Main {
public static void main(String args[]){
//System是一个类,out是里面的成员属性,println()是out对象中的方法
Consumer<String>consumer=System.out::println; //输出方法只需接收参数,不需要返回值
consumer.accept("www.kuiba.cn"); //信息输出
}
}
程序执行结果:
www.kuiba.cn
本程序利用消费型函数式接口接收了System.out.println()方法的引用,此方法定义中需要接收一个String类型数据,但是不会返回任何结果。
(3)供给型函数式接口:该接口的主要功能是方法不需要接收参数,并且可以进行数据返回。
@FunctionalInterface
public interface Supplier<T>{ //供给型函数式接口,设置返回值类型
public T get(); //不接收参数,但会返回数据
}
范例:使用供给型函数式接口
本次将引用String类中的字符串转小写方法:public String toLowerCase()。
package cn.kuiba.util;
import java.util.function.*;
public class Main {
public static void main(String args[]){
//toLowerCase()方法不需要接收参数,会将当前String类对象的内容进行转换
Supplier<String>supplier="www.KUIBA.cn"::toLowerCase;
System.out.println(supplier.get()); //获取数据
}
}
程序执行结果:
www.kuiba.cn
本程序使用了供给型函数式接口,此接口上不需要接收参数,所以直接利用String类的实例化对象引用toLowerCase()方法,当调用了get()方法后就可实现大写转换操作。
(4)断言型函数式接口:断言型函数式接口主要是进行判断操作,本身需要接收一个参数,同时会返回一个boolean结果。
@FunctionalInterface
public interface Predicate<T>{ //断言型函数式接口,需要设置判断的数据类型
public boolean test(T t); //逻辑判断
}
范例:使用断言型函数式接口
本次将引用String类中的忽略大小写比较方法:public boolean equalsIgnoreCase(String str)。
package cn.kuiba.util;
import java.util.function.*;
public class Main {
public static void main(String args[]){
//equalsIgnoreCase()方法需要接收一个字符串型数据,并且与当前String类对象内容进行比较
Predicate<String>predicate="kuiba"::equalsIgnoreCase;
System.out.println(predicate.test("KUIBA")); //判断调用
}
}
程序执行结果:
true
本程序直接将String类的equalsIgnoreCase()这个普通方法利用断言型函数式接口进行引用,而后进行忽略大小写比较。