1.函数式接口:有且仅有一个抽象方法的接口,java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口,只有确保接口有且仅有一个抽象方法,java中的Lambda才能顺利的进行推导
1.@FunctionalInterface
2.放在接口定义的上方:如果接口是函数式接口,编译通过;如果不是,编译失败
@FunctionalInterface
public interfaceSum {
void show();
}
1.我们自己定义函数式接口时候,@FunctionalInterface是可选的,就算我不写这个注解,只要保证满足函数式接口定义条件, 也照样是函数式接口。但是,建议加上该注解
1.如果方法的参数提供是一个函数式接口,我们可以使用Lambda表达式做为参数传递
startThread(() -> System.out.println(Thread.currentThread().getName()+"线程启动"))
1.如果返回值是一个函数式接口,我们可以使用Lambda表示作为结果返回
private static Comparator getComparator(){
return (s1,s2) -> s1.length()-s1.length();
}
1.Supplier接口
2.Consumer接口
3.Predicate接口
4.Function接口
1.Supplier
:包含一个无参的方法 2.T get():获得结果
3.该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
4.Supplier
接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用
private static String getString(Supplier s){
return s.get();
}
private static Integer getInteger(Supplier i){
return i.get();
}
1.Consumer
:包含两个方法 2.void accept(T t):对给定的参数执行操作
3.default Consumer
andThen(Consumer after) :返回一个组合的Consumer,依次执行操作,然后执行after操作4.Consumer
接口也被称为消费型接口,它消费的数据类型由泛型指定
public static void main(String[] args) {
operatorString("亚瑟",(String s) -> System.out.println(s));
operatorString("貂蝉",s -> System.out.println(s));
operatorString("安其拉",System.out::println);
operatorString("安其拉",(String s) -> {
System.out.println(new StringBuilder(s).reverse().toString());
});
operatorString("貂蝉",s -> System.out.println(new StringBuilder(s).reverse().toString()));
operatorString("成吉思汗",s -> System.out.println(s),s1 -> System.out.println(new StringBuilder(s1).reverse().toString()));
}
//定义一个方法,用不同的方式消费同一个字符串数据两次
private static void operatorString(String name,Consumer con,Consumer con1){
// con.accept(name);
// con1.accept(name);
con.andThen(con1).accept(name);
}
//定义一个方法,消费一个字符串数据
private static void operatorString(String name, Consumer con){
con.accept(name);
}
1.Predicate
:常用的四个方法 2.boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值
3.default Predicate
negate() :返回一个逻辑的否定,对应逻辑非4.default Predicate
and(Predicate other): 返回一个组合判断,对应短路与5.default Predicate
ot(Predicate other) :返回一个组合判断,对应短路或6.Predicate
接口通常用于判断参数是否满足指定的条件
public static void main(String[] args) {
boolean b = checkString("hll",s -> s.length() > 8);
System.out.println(b);
boolean b1 = checkString("HelloWorld",s -> s.length() > 8);
System.out.println(b1);
boolean b2 = checkString("hell",s -> s.length() > 8,s -> s.length() < 15);
System.out.println(b2);
boolean b3 = checkString("HelloWorld",s -> s.length() > 8,s -> s.length() < 15);
System.out.println(b3);
}
private static boolean checkString(String s,Predicate pre,Predicate pre1){
return pre.or(pre1).test(s);//相当于||
}
private static boolean checkString(String s,Predicate pre){
return pre.negate().test(s);
}
1.Function
:两个常用方法,T表示输入数据类型,R表示输出数据类型 2.R apply
:将此函数应用与给定的参数 3.default
Function andThen(Function after) :返回一个组合函数,首先将该函数应用与输入,然后将after函数应用于结果4.Function
接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值
public static void main(String[] args) {
convert("100",s -> Integer.parseInt(s));
convert(100,i -> String.valueOf(i + 566));//键int类型转换为字符串
convert("100",s -> Integer.parseInt(s),i -> String.valueOf(i + 566));
}
private static void convert(String s,Function fun){
int i = fun.apply(s);
System.out.println(i);
}
private static void convert(int i,Function fun){
String s = fun.apply(i);
System.out.println(s);
}
private static void convert(String s,Function fun,Function fun1){
String ss = fun.andThen(fun1).apply(s);
System.out.println(ss);
}