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));
}

运行结果:

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

java代码(14) --Java8函数式接口的更多相关文章

  1. java代码之美(14)---Java8 函数式接口

    Java8 函数式接口 之前写了有关JDK8的Lambda表达式:java代码之美(1)---Java8 Lambda 函数式接口可以理解就是为Lambda服务的,它们组合在一起可以让你的代码看去更加 ...

  2. 简析JAVA8函数式接口

    一,定义 "有且只有一个抽象方法的接口"----函数式接口的定义. @FunctionalInterface public interface Ifun{ void test(); ...

  3. 恕我直言你可能真的不会java第8篇-函数式接口

    一.函数式接口是什么? 所谓的函数式接口,实际上就是接口里面只能有一个抽象方法的接口.我们上一节用到的Comparator接口就是一个典型的函数式接口,它只有一个抽象方法compare. 只有一个抽象 ...

  4. Java8 函数式接口 @FunctionalInterface以及常用Consumer<T>、Supplier<T>、Function<T, R>、Predicate<T>总结

    首先看看什么是Lambda 表达式 Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码(将代码像数据一样传递):最简单的Lambda表达式可由逗号分隔的参数列表.-> ...

  5. [二] java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    函数式接口详细定义 package java.lang; import java.lang.annotation.*; /** * An informative annotation type use ...

  6. Java8 函数式接口-Functional Interface

    目录 函数式接口: JDK 8之前已有的函数式接口: 新定义的函数式接口: 函数式接口中可以额外定义多个Object的public方法一样抽象方法: 声明异常: 静态方法: 默认方法 泛型及继承关系 ...

  7. java8 函数式接口——Function/Predict/Supplier/Consumer

    Function 我们知道Java8的最大特性就是函数式接口.所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上 ...

  8. java8函数式接口详解、函数接口详解、lambda表达式匿名函数、方法引用使用含义、函数式接口实例、如何定义函数式接口

    函数式接口详细定义 函数式接口只有一个抽象方法 由于default方法有一个实现,所以他们不是抽象的. 如果一个接口定义了一个抽象方法,而他恰好覆盖了Object的public方法,仍旧不算做接口的抽 ...

  9. 详解JAVA8函数式接口{全}

    1: 函数式接口 1.1 概念 1.2 格式 1.3@FunctionalInterface注解 1.4 调用自定义函数接口 2:函数式编程 2.1:lambda的延迟执行 2.2 使用Lambda作 ...

随机推荐

  1. mysql-kettle-superset电商可视化数据分析

    1.项目概述 需求 对电商业务中的用户.商品.订单的数据进行分析,观察运营的情况 架构 业务数据库:Mysql:存储最原始的数据 ETL:Kettle 数据仓库:Mysql:存储需要进行分析处理的数据 ...

  2. mybatis中 #{} 和 ${}

    在mybatis中#{}表示一个占位符: 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号 2.#在很大程度上可以防止sql注入 3.例如#{id}:#{}中的id表示输入的参数名称 ...

  3. JTextpane 添加行号

    最近项目需求,需要在JTextPane上添加行号等信息,网上找了好久只找到JTextArea添加行号信息,copy网上的程序研究了下,发现自己改改就可以让JTextPane显示行号! 代码: pack ...

  4. python 调用ldap同步密码

    windows + python2.7 安装 python-ldap https://www.lfd.uci.edu/~gohlke/pythonlibs/#python-ldap 2.python ...

  5. R的安装以及包安装

        今天看论文,需要用到R语言的库,于是又折腾了半天..     其实并没有什么太大的问题,只是在第三方包的下载方面还有python中使用R方面遇到了问题: 第三方包的导入      其实在网上有 ...

  6. 【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

    喜欢今日头条,偶然看到广告,半个多月前交了8.9元,报名参加了头条上Python的四天培训课,呵呵,总算是有了零的开始(还是有点收获的,见https://www.sohu.com/a/38112874 ...

  7. netty 实现简单的rpc调用

    yls 2020/5/23 netty 实现简单rpc准备 使用netty传输java bean对象,可以使用protobuf,也可以通过json转化 客户端要将调用的接口名称,方法名称,参数列表的类 ...

  8. 使用Buildpacks高效构建Docker镜像

    1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...

  9. JS最通俗易懂简易轮播实现

    轮播图作为前端比较简易的动画,使用非常频繁,这里记录以便使用 此轮播图为最简易自动播放,非无缝,无按钮,无缩略图和序号 想看全套轮播图可以查看我的分类轮播图全套 html 布局 <div sty ...

  10. PHP文件上传案例和函数

    $_FILES参数详解: $_FILES["file"]["name"] – 被上传文件的名称 $_FILES["file"][" ...