函数式接口
有且仅有一个抽象方法的接口
如何检测一个接口是不是函数接口?
@FunctionalInterface
以这个符号标记并且不报错的,就是函数式接口
Java8在java.util.function包下预定义了大量的函数式接口供我们使用
- Supplier接口
- Consumer接口
- Predicate接口
- Function接口
一. Supplier 接口
Supplier: 包含一个无参的方法
- T get(): 获得结果
- 改方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
- Supplier接口被成为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法会生产什么类型的数据提供给我们使用
Integer integer = supplierInteger(() -> 10000);
System.out.println(integer);
public static Integer supplierInteger(Supplier<Integer> supplier) {
return supplier.get();
}
二. Consumer 接口
Consumer: 包含两个方法
- void accept(T t): 给指定的参数执行此操作
- default Consumer andThen(Consumer after): 返回一个组合的Consumer,依次执行此操作,然后执行after操作
- Consumer接口也被称为消费型接口,它消费的数据类型由泛型指定
public class ConsumerDemo {
public static void main(String[] args) {
consumer("林青霞",(s) -> {
System.out.println(s);
});
// 优化
consumer("林青霞",s -> System.out.println(s));
// 方法引用
consumer("林青霞", System.out::println);
//
consumer("林青霞",s -> System.out.println(new StringBuffer(s).reverse().toString()));
System.out.println("--------");
// 两个consumer
consumer("林青霞",s -> System.out.println(s), s -> System.out.println(new StringBuffer(s).reverse().toString()));
}
private static void consumer(String s, Consumer<String> consumer) {
consumer.accept(s);
}
// 两个consumer
private static void consumer(String s, Consumer<String> consumer1, Consumer<String> consumer2) {
// 第一种
consumer1.accept(s);
consumer2.accept(s);
// 第二种
consumer1.andThen(consumer2).accept(s);
}
}
三. Predicate接口
Predicate常用的四个方法
- boolean test(T t): 对给定的参数进行判断,返回一个布尔值
- default Predicate negate(): 返回一个逻辑的否定,对应逻辑非
- default Predicate and(Predicate other): 返回一个组合判断,对应短路与
- default Predicate or(Predicate other): 返回一个组合判断,对应短路或
public class PredicateDemo01 {
public static void main(String[] args) {
boolean b1 = checkString("fjskk", s -> {
return s.length() > 8;
});
System.out.println(b1);
System.out.println("--------");
// 简化
boolean b2 = checkString("和hi法华寺hi方式", s -> s.length() > 8);
System.out.println(b2);
}
// 判断给定的字符串的长度,是否大于8
private static boolean checkString(String s, Predicate<String> pre) {
// 直接返回
//return pre.test(s);
// 逻辑非操作
// return !pre.test(s); 这两个是相同的
return pre.negate().test(s);
}
}
boolean b4 = checkString("helloworld",s -> s.length() > 8, s -> s.length() < 15);
System.out.println(b4);
//同一个字符串给出两个不同的判断条件,最后把这两个判断的结果做逻辑与运算的结果作为最终的结果
private static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
// boolean b1 = pre1.test(s);
// boolean b2 = pre2.test(s);
// boolean b = b1 && b2;
// return b;
// return pre1.and(pre2).test(s);
return pre1.or(pre2).test(s);
}
四. Function 接口
Function<T,R>: 常用的两个方法
- R apply(T t): 将此函数应用于给定的参数
- default Function andThen(Function after): 返回一个组合函数,首先将改函数应用于输入,然后after函数应用于结果
- Funtion<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值
public class FunctionDemo {
public static void main(String[] args) {
//
//定义一个方法,把一个字符串转换int类型,在控制台输出
int i1 = fun("100",Integer::parseInt);
System.out.println(i1);
System.out.println("--------");
//定义一个方法,把一个int类型的数据加上一个整数之后,转为字符串在控制台输出
String s2 = fun(100, i2 -> i2 + 100 + "");
System.out.println(s2);
System.out.println("--------");
//定义一个方法,把一个字符串转换int类型,把int类型的数据加上一个整数之后,转为字符串在控制台输出
String s1 = fun1("200", s -> Integer.parseInt(s), i3 -> i3 + 100 + "");
System.out.println("s1 = " + s1);
}
//定义一个方法,把一个字符串转换int类型,在控制台输出
public static int fun(String s, Function<String, Integer> fun) {
Integer apply = fun.apply(s);
return apply;
}
//定义一个方法,把一个int类型的数据加上一个整数之后,转为字符串在控制台输出
public static String fun(int k, Function<Integer, String> function) {
return function.apply(k);
}
//定义一个方法,把一个字符串转换int类型,把int类型的数据加上一个整数之后,转为字符串在控制台输出
private static String fun1(String s, Function<String, Integer> fun1, Function<Integer, String> fun2){
return fun1.andThen(fun2).apply(s);
}
}
五. 案例
/*
String s = "林青霞,30";
请按照我指定的要求进行操作:
1:将字符串截取得到数字年龄部分
2:将上一步的年龄字符串转换成为int类型的数据
3:将上一步的int数据加70,得到一个int结果,在控制台输出
请通过Function接口来实现函数拼接
*/
public class FunctionTest {
public static void main(String[] args) {
String s = "林青霞,30";
int result = fun(s, s1 -> s1.split(",")[1], s2 -> Integer.parseInt(s2), i -> i + 70);
System.out.println("result = " + result);
}
private static int fun(String s, Function<String, String> fun1, Function<String, Integer> fun2, Function<Integer,Integer> fun3) {
return fun1.andThen(fun2).andThen(fun3).apply(s);
}
}