一、函数式接口
1.1 有且仅有一个抽象方法的接口
1.2 @FunctionalInterface注解
定义在一个接口上,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。不使用也无妨。
1.3 自定义函数式接口
对于刚刚定义好的 MyFunctionalInterface 函数式接口,典型使用场景就是作为方法的参数:
代码如下:
public class Demo09FunctionalInterface {
// 使用自定义的函数式接口作为方法参数
private static void doSomething(MyFunctionalInterface inter) {
inter.myMethod(); // 调用自定义的函数式接口方法
}
public static void main(String[] args) {
// 调用使用函数式接口的方法
doSomething(() ‐> System.out.println("Lambda执行啦!"));
}
}
二、函数式编程
2.1 使用lambda作为参数和返回值
如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。当需要通过一
个方法来获取一个 java.util.Comparator 接口类型的对象作为排序器时,就可以调该方法获取。
代码:
import java.util.Arrays;
import java.util.Comparator;
public class Demo06Comparator {
private static Comparator<String> newComparator() {
return (a, b) ‐> b.length() ‐ a.length();
}
public static void main(String[] args) {
String[] array = { "abc", "ab", "abcd" };
System.out.println(Arrays.toString(array));
Arrays.sort(array, newComparator());
System.out.println(Arrays.toString(array));
}
}
三、 常用函数式接口
3.1 supplier接口
public class Spl_01 {
//定义一个方法,方法的参数传递Supplier<T>接口,泛型执行String,get方法就会返回一个String
public static String getString(Supplier<String> sup){
return sup.get();
}
public static void main(String[] args) {
String s = getString(() -> "我爱JAVA");
System.out.println(s);
}
}
3.2 Consumer接口
/*
Consumer接口是一个消费型接口,泛型执行什么类型,就可以用accept方法消费什么类型的数据(使用),
至于怎么消费,需要自定义(输出、计算)。
*/
import java.util.function.Consumer;
public class CS_p {
public static void method(String[] t, Consumer<String> con1,Consumer<String> con2){
for (String s : t) {
con1.andThen(con2).accept(s);
}
}
public static void main(String[] args) {
String[] t = {"迪丽热巴,女","古力娜扎,女","马儿扎哈,男"};
method(t,(s) -> System.out.print("姓名:"+s.split(",")[0]+" "),
(s -> System.out.println("性别:"+s.split(",")[1])));
}
}
3.3 Predicate接口
Predicate 接口中包含一个抽象方法: boolean test(T t) 。用于条件判断的场景:
import java.util.function.Predicate;
public class Prd_T {
public static Boolean methodS(String s, Predicate<String> pre,Predicate<String> pre1){
return pre.test(s)&&pre1.test(s);
}
public static void main(String[] args) {
String[] str = {"古力娜扎,女","马儿扎哈,男","杰洛特,男","赵丽颖,女"};
for (String s : str) {
if ((methodS(s,(s1)-> s1.split(",")[0].length()==4,
(s1)->s1.split(",")[1].equals("女")) == true)) {
System.out.println(s);
}
}
}
}
3.4 Function接口
java.util.function.Function<T,R> 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,
后者称为后置条件。
Function 接口中最主要的抽象方法为: R apply(T t) ,根据类型T的参数获取类型R的结果。使用的场景例如:将 String 类型转换为 Integer 类型。
代码:
import java.util.function.Function;
public class Fun_03 {
public static void Pr(String str, Function<String,String> fun,Function<String,Integer> fun1){
Integer in = fun.andThen(fun1).apply(str);
System.out.println(in);
}
public static void main(String[] args) {
String s = "赵丽颖,20";
Pr(s,(s1)-> s1.split(",")[1],
(s1) -> Integer.parseInt(s1)+100);
}
}