Java8函数式接口


之前有关JDK8的Lambda表达式 Java代码(1)--Java8 Lambda

函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加简洁

一、概念

1、什么是函数式接口

  所谓函数式接口,当然首先是一个接口,然后就是在这个接口里面 只能有一个抽象方法

有关函数式接口,有个专门的注解叫  @FunctionalInterface ,该注解主要特点有:

    1、该注解只能标记在“有且仅有一个抽象方法”的接口上,表示函数式接口
2、JDK8接口中的静态方法和默认方法,都不算抽象方法
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中的方法,那么也不算抽象方法
4、允许java.lang.Object中的public方法
5、该注解不是必须的,如果一个接口符合‘函数式编程’定义,那么加不加该注解都没有影响,加上该注解能够让编译器更好的检查,如果编写的不是函数式接口,但是加上了@FunctionalInterface那么编译器会报错

正确示例

/**
* 函数式接口注解
*/
@FunctionalInterface
public interface PersonInterface {
/**
* 1、仅有一个抽象方法
*/
void say();
/**
* 2、java.lang.Object中的方法不算
*/
@Override
boolean equals(Object object);
/**
* 3、java8接口才可以默认的方法实现,前提是方法名称必须使用default关键字修饰
*/
default void defaultMethod(){
System.out.println("hello");
}
/**
* 4、静态方法
*/
static void staticMethod(){ }
}

错误示例

    /**
* 函数式接口注解
*/
@FunctionalInterface //编译直接报错
public interface Test{ //1抽象方法
void say(); //2抽象方法
void jump();
}

加上@FunctionInterface,就代表该接口是函数式接口,只能有一个抽象方法,如果多个编译直接报错

3、为什么只能有一个抽象方法

其实这个问题很好去理解,上面说了函数式接口主要是为Lambda语法服务的,为了让代码看上去更简洁

下面通过示例来说明

 public static void main(String[] args) {
PersonInterface inter =() -> System.out.println("说什么呢?");
inter.say();
//输出:说什么呢? }

通过函数式接口+Lambda表达式让代码看上去变得简洁的,关键点在于

 ()->{} 就代表对say()方法的重写

如果有多个抽象方法,那么()->{ } 这种写法,编译器就不知道这个重写哪个方法了,所以这就是为什么只能有一个抽象方法的原因

二、综合示例

这里在举一个综合示例,来方便理解它们

自定义函数式接口

/**
* 自定义函数TestFunction 提供handler接口,传入的是A,返回的是B
* @param <A>
* @param <B>
*/
@FunctionalInterface
public interface MyFunction<A,B> {
B handler(A a ,A a1);
}

Student对象

@Data
@AllArgsConstructor
@ToString
public class Student {
//姓名
private String name;
//年龄
private Integer age;
}

测试类

 public static void main(String[] args) {
//1.求和,传入integer返回integer类型
MyFunction<Integer,Integer> myFunction=(x,y)->{
return x+y;
};
Integer count=myFunction.handler(5,10);
System.out.println("输出总和为:"+count); //2、求和传入integer返回String类型
MyFunction<Integer,String> myFunction1=(x,y)->{
return x+"+"+y+"="+(x+y);
};
System.out.println(myFunction1.handler(5,10)); //3、对象处理过滤对象
List<Student> students= Arrays.asList(new Student("小明",3),new Student("小白",13),new Student("小黄",19));
MyFunction<Integer,List<Student>> myFunction2=(x,y)->{
List<Student> studentList=students.stream().filter(student -> student.getAge()>x && student.getAge()<y).collect(Collectors.toList());
return studentList;
};
List<Student> list=myFunction2.handler(5,15);
list.forEach(x-> System.out.println(x));
}

运行结果:

从运行结果可以很明显看出,集合对象经过过滤只剩下一个满足条件的了。

最新文章

  1. 引人瞩目的 CSS 变量(CSS Variable)
  2. 使用 OAuth2-Server-php 在 Yii 框架上搭建 OAuth2 Server
  3. (转)oracle中用户删除不了,ORA-01940提示 “无法删除当前已连接用户”
  4. java web 学习七(HttpServletResponse对象1)
  5. 解释清楚c++的重载操作符【用自己的话,解释清楚】
  6. 常用的富文本框插件FreeTextBox、CuteEditor、CKEditor、FCKEditor、TinyMCE、KindEditor ;和CKEditor实例
  7. jQuery多图上传Uploadify插件使用及传参详解
  8. 【HDOJ】2289 Cup
  9. 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET
  10. 文件描述符与FILE
  11. day22 Pythonpython 本文xml模块
  12. .net Parallel并行使用注意事项
  13. spring+quartz报错:Table &#39;XXXX.QRTZ_TRIGGERS&#39; doesn&#39;t exist
  14. 错误/异常:java.net.SocketException: Unrecognized Windows Sockets error: 0: JVM_Bind;的解决方法
  15. OpenWRT使用wifidog实现强制认证的WIFI热点
  16. Git -- 新增分支添加新功能
  17. 理解REST和SOA
  18. AngularJs2 构建简单的英雄编辑器
  19. KineticJS教程(7)
  20. Unix/Linux操作系统中如何在sqlplus/rman中使用方向键

热门文章

  1. 《学习笔记》.NET Core API搭建
  2. java -&gt;String、StringBuffer、StringBuilder三者之间的区别
  3. docker 使用 Nvidia 显卡
  4. 1、Fiddler基础
  5. Spring 获取bean
  6. 27-1 分组-having
  7. linux DRM/KMS 测试工具 modetest、kmscude、igt-gpu-tools (二)
  8. JPA EntityManager 在没有实体类的情况下返回Map
  9. 重学 Java 设计模式:实战抽象工厂模式
  10. WordPress批量更换域名