一、函数式接口概述:
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<String> getComparator(){
return (s1,s2) -> s1.length()-s1.length();
}
六、常用的函数式接口:
1.Supplier接口
2.Consumer接口
3.Predicate接口
4.Function接口
七 、Supplier接口:
1.Supplier<T>:包含一个无参的方法
2.T get():获得结果
3.该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据
4.Supplier<T>接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用
private static String getString(Supplier<String> s){
return s.get();
}
private static Integer getInteger(Supplier<Integer> i){
return i.get();
}
八、Consumer接口:
1.Consumer<T>:包含两个方法
2.void accept(T t):对给定的参数执行操作
3.default Consumer<T> andThen(Consumer after):返回一个组合的Consumer,依次执行操作,然后执行after操作
4.Consumer<T>接口也被称为消费型接口,它消费的数据类型由泛型指定
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<String> con,Consumer<String> con1){
// con.accept(name);
// con1.accept(name);
con.andThen(con1).accept(name);
}
//定义一个方法,消费一个字符串数据
private static void operatorString(String name, Consumer<String> con){
con.accept(name);
}
九、Predicate接口:
1.Predicate<T>:常用的四个方法
2.boolean test(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值
3.default Predicate<T> negate():返回一个逻辑的否定,对应逻辑非
4.default Predicate<T> and(Predicate other):返回一个组合判断,对应短路与
5.default Predicate<T> ot(Predicate other):返回一个组合判断,对应短路或
6.Predicate<T>接口通常用于判断参数是否满足指定的条件
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<String> pre,Predicate<String> pre1){
return pre.or(pre1).test(s);//相当于||
}
private static boolean checkString(String s,Predicate<String> pre){
return pre.negate().test(s);
}
十、Function接口:
1.Function<T,R>:两个常用方法,T表示输入数据类型,R表示输出数据类型
2.R apply<T t>:将此函数应用与给定的参数
3.default<V> Function andThen(Function after):返回一个组合函数,首先将该函数应用与输入,然后将after函数应用于结果
4.Function<T,R>接口通常用于对参数进行处理,转换(处理逻辑由Lambda表达式实现),然后返回一个新的值文章来源:https://www.toymoban.com/news/detail-400882.html
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<String,Integer> fun){
int i = fun.apply(s);
System.out.println(i);
}
private static void convert(int i,Function<Integer,String> fun){
String s = fun.apply(i);
System.out.println(s);
}
private static void convert(String s,Function<String,Integer> fun,Function<Integer,String> fun1){
String ss = fun.andThen(fun1).apply(s);
System.out.println(ss);
}
文章来源地址https://www.toymoban.com/news/detail-400882.html
到了这里,关于Java基础篇--函数式接口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!