有且仅有一个抽象方法的接口
是lambda表达式的前提
需要注意的是
Java中的函数式编程体现的就是Lambda表达式,所以函数式接口就是可以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的lambda才能顺利地进行推导
public interface MyInterface{
void show();
}
public class MyInterfaceDemo{
public static void main(String[] args){
MyInterface my=()->System.out.println("函数式接口");
my.show();
}
}
如何检测一个接口是不是函数式接口?
注意
需求
public class RunnableDemo{
public static void main(String[] args){
//匿名内部类的方式
startThread(new Runnable(){
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+"线程启动了!");
}
});
//Lambda表达式改进
startThread(()->System.out.println(Thread.currentThread().getName()+"线程启动了!"));
}
private static void startThread(Runnable r){
//Thread t=new Thread(r);
//t.start();
new Thread(r).start();
}
}
如果方法的参数是一个函数式接口,可以使用Lambda表达式作为参数传递
需求
public class ComparatorDemo{
public static void main(String[] args){
//构造使用场景
//定义集合存储字符串元素
ArrayList<String> array=new ArrayList<String> ();
array.add("c");
array.add("aaa");
array.add("bb");
System.out.println("排序前:"+array);
Collections.sort(array, getcomparator()) ;
System.out.println("排序后:"+array);
}
public static Comparator<String> getComparator(){
//匿名内部类的方式实现
// Comparator comp=new Comparator(){
// @Override
// public int compare(String s1,String s2){
// return s1.length()-s2.length();
// }
// };
// return comp;
// return new Comparator(){
// @Override
// public int compare(String s1,String s2){
// return s1.length()-s2.length();
// }
//lambda表达式
// return (String s1,String s2)->{
// return s1.length()-s2.length();
// };
// }
return (s1,s2)-> return s1.length()-s2.length();
}
}
}
如果方法的返回值是一个函数式接口,可以使用lambda表达式作为结果返回
Supplier:包含一个无参的方法
public class SupplierDemo{
public static void main(String[] args){
// String s=getString(()->{
// return "伦伦";
// });
String s=getString(()->"伦伦");
System.out.println(s);
Integer i=getInteger(()->30);
System.out.println(i);
}
//定义一个方法,返回一个字符串数据
private static String getString(Supplier<String> sup){
return sup.get();
}
//定义一个方法返回整数数据
private static Integer getInteger(Supplier<Integer> sup){
return sup.get();
}
}
Consumer:包含两个方法
public class ConsumerDemo{
public static void main(String[] args){
// operatorString("伦伦",(String s)->{
// System.out.println(s);
// });
operatorString("伦伦",s->System.out.println(s));
//方法引用改进
operatorString("伦伦",System.out::println);
operatorString("Y伦伦",(s)->{
System.out.println(new StringBuilder(s).reverse().toString());
});
//优化
operatorString("Y伦伦",s->System.out.println(new StringBuilder(s).reverse().toString()));
System.out.println("----------");
operatorString("Y伦伦",s->System.out.println(s),s->System.out.println(new StringBuilder(s).reverse().toString()));
}
//定义一个方法消费字符串数据
private static void operatorString(String name,Consumer<String> con){
con.accept(name);
}
//定义一个方法,用不同的方式消耗同一个字符串两次
private static void operatorString(String name,Consumer<String> con1,Consumer<String> con2){
// con1.accept(name);
// coo2.accept(name);
//改进
con1.andThen(con2).accept(name);
}
}
Predicate:常用的四个方法
public class PredicateDemo01{
public static main(String[] args){
boolean b1=checkString("Hello",s->return s.length()>8);
System.out.println(b1);
boolean b2=checkString("HelloWorld",s->return s.length()>8);
System.out.println(b2);
}
private static boolean checkString(String s,Predicate<String> pre){
return pre.test();
}
}
Function
class FunctionDemo{
public static main(String[] args){
String s="伦伦,25";
covert(s,ss->{ss.split(",")[1]},ss->Integer::parseInt,i->i+100);
}
private static void covert(String s,Function<String,String> fun1,Function<String ,Integer> fun2,Function<Integer,Integer> fun3){
int i=fun1.abdThen(fun2).andThen(fun3).apply(s);
System.out.println(i);
}
}