公共定义的函数式接口
从jdk1.8开始为了方便用户开发专门提供了一个新的包:java.util.function
在这个包里面针对于用户可能用到的函数式接口做了一个公共定义。
最为核心的有四个接口:
功能性接口:Function
有输入参数,有返回值
是对接收一个T类型参数,返回R类型的结果的方法的抽象
通过调用apply方法执行内容
需求:给定一个字符串,返回字符串长度
import java.util.function.Function;
public class Demo1 {
public static void main(String[] args) {
// 定义字符串
String str = "helloworld";
//第一种写法:不调用方法
Function fun1=(s)->{
int length = s.length();
return length;
};
Integer length1 = fun1.apply(str);
System.out.println(length1);
//第二种写法:调用方法
//在调用的时候写方法体,方法比较灵活
int length = testFun(str, (s) -> s.length());
System.out.println(length);
}
// 方法
/**
* @param str 输入参数
* @param fun 表达式 String 为输入类型,Integer为输出类型
* @return 返回字符串长度
*/
public static int testFun(String str, Function fun) {
// 执行
Integer length = fun.apply(str);
return length;
}
}
消费型接口:Consumer
有输入参数,没返回值
对应的方法类型为接收一个参数,没有返回值
Consumer 使用accept对参数执行行为
需求:输出字符串
import java.util.function.Consumer;
public class Demo2 {
public static void main(String[] args) {
// 创建字符串
String str = "hello world";
//第一种写法:不调用方法
Consumer con1=(s)->{
System.out.println(s);
};
con1.accept(str);
//第二种写法:调用方法
testCon(str, (s) -> System.out.println(s));
}
/**
*
* @param str 传入参数
* @param con
*/
public static void testCon(String str, Consumer con) {
// 执行
con.accept(str);
}
}
供给型接口:Supplier
无传入参数,有返回值
该接口对应的方法类型不接受参数,但是提供一个返回值
使用get()方法获得这个返回值
import java.util.function.Supplier;
public class Demo3 {
public static void main(String[] args) {
// 创建字符串
String str = "hello world";
//第一种写法:不调用方法
Supplier sup1=()->{
return str;
};
String s = sup1.get();
System.out.println(s);
//第二种写法:调用方法
String sup = testSup(() -> str);
System.out.println(sup);
}
/**
*
* @param sup
* @return
*/
public static String testSup(Supplier sup) {
// 执行
String s = sup.get();
return s;
}
}
断言型接口:Predicate
有传入参数,有返回值Boolean
该接口对应的方法为接收一个参数,返回一个Boolean类型值
多用于判断与过滤,使用test()方法执行这段行为
需求:输入字符串,判断长度是否大于0
import java.util.function.Predicate;
public class Demo4 {
public static void main(String[] args) {
// 创建字符串
String str = "hello world";
//第一种写法:不调用方法
Predicate pre = (s) -> {
boolean b = s.length() > 0;
return b;
};
boolean test = pre.test(str);
System.out.println(test);
//第二种写法:调用方法
//在调用的时候写方法体,方法比较灵活
boolean flag = testPre(str, (s) -> s.length() > 0);
System.out.println(flag);
}
/**
* @param str
* @param pre
* @return
*/
public static boolean testPre(String str, Predicate pre) {
// 执行
boolean flag = pre.test(str);
return flag;
}
}