一文搞懂函数式接口

Lambda表达式实际上是函数式接口的实现类的对象,今天我们就来详细了解函数式接口。什么是函数式接口使用@FunctionalInterface注解修饰的接口就是函数式接口。@FunctionalInterface
public interface Runnable {
/**
* Runs this operation.
/
void run();
}这是Runnable接口的源码,Runnable接口就属于函数式接口。我们看到几个特点:只有一个抽象方法的接口使用@FuncationInterface注解来标识@FuncationInterface注解起到约束定义的作用。当一个接口不满足只有一个抽象方法这个条件时,该接口就不属于函数式接口,注解会通知编译器检查并报错。原来,函数式接口如此简单。那么,函数式接口有哪些具体的应用场景呢?我们先来看函数式接口的分类。函数式接口的分类根据应用场景不同,函数式接口又分成了以下几种:接口参数类型返回类型说明Consumer< T > 消费型接口Tvoidvoid accept(T t);对类型为T的对象应用操作Supplier< T > 供给型接口无TT get(); 返回类型为T的对象Function< T,R > 函数型接口TRR apply(T t);对类型为T的对象应用操作,并返回类型为R类型的对象。Predicate< T > 断言型接口Tbooleanboolean test(T t);确定类型为T的对象是否满足条件,并返回boolean类型。消费型接口消费型接口可以理解为使用者提供消费参数,消费型接口内部只做具体操作,也就是消费,不做返回。是不是有点难理解?我们可以这样认为,消费型接口约定好了消费这个动作,具体怎么消费由lambda的方法体来定义。也就是说,lambda方法体实际上就是重写了消费型接口的apply方法,在方法体中声明了具体的消费行为。@FunctionalInterface
public interface Consumer {
/
*
* Performs this operation on the given argument.
*
* @param t the input argument
*/
void accept(T t);接下来我们来看消费型接口的例子://Lambda表达式
Consumer consumer= t->System.out.println(“聚餐消费:”+t);
double money=1000;
consumer.accept(money);供给型接口站在接口的角度,将内容提供给调用者。至于具体提供什么内容,由lambda表达式重写的方法体说了算。因此供给型接口不需要入参,只提供返回的内容。@FunctionalInterface

public interface Supplier {
/**
* Gets a result.
*
* @return a result
/
T get();
}接下来我们来看供给型接口的例子://Supplier 供给型接口
public static int[] getNums(Supplier supplier,int count) {
int[] arr=new int[count];
for(int i=0;i arr[i]=supplier.get();
}
return arr;
}
//new Random().nextInt(100)为get内容
int[] arr=getNums(()->new Random().nextInt(100), 5);
System.out.println(Arrays.toString(arr));断言型接口很好理解,断言型接口根据入参返回true或者false。具体的判断逻辑由lambda表达式重写的方法体来决定。@FunctionalInterface
public interface Predicate {
/
*
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
/
boolean test(T t);
}下面我们来看断言型接口的案例://参数为断言型接口
public static List filterNames(Predicate predicate,List list){
List resultList=new ArrayList();
for (String string : list) {
if(predicate.test(string)) {
resultList.add(string);
}
}
return resultList;
}
//将满足断言型接口中定义的条件的字符串填入到list中
List result=filterNames(s->s.startsWith(“zhang”), list);
System.out.println(result.toString());功能型接口功能型接口即有入参也有出参,专注于对内容的加工,并返回加工后的内容。至于具体如何加工,当然是由lambda表达式重写的方法体来确定啦。@FunctionalInterface
public interface Function {
/
*
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
}下面我们来看下使用功能型接口实现内容加工的案例: //参数为功能型接口
public static String handlerString(Function function,String str) {
return function.apply(str);
}
//将传入的字符串转换成大写
String result=handlerString(s->s.toUpperCase(), “hello”);
System.out.println(result);总结函数型接口与Lambda相互结合,成为Java8极具分量的新功能。希望通过这篇文章,能够让大家快速掌握函数型接口的用法。

你可能感兴趣的:(java,java,开发语言)