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. HBase 安装snappy压缩软件以及相关编码配置

    HBase 安装snappy压缩软件以及相关编码配置 前言 ​ 在使用HBase过程中因为数据存储冗余.备份数等相关问题占用过多的磁盘空间,以及在入库过程中为了增加吞吐量所以会采用相关的压缩算法来压缩 ...

  2. shrine

    0x01 import flask import os app = flask.Flask(__name__) app.config['FLAG'] = os.environ.pop('FLAG') ...

  3. Docker容器映射到宿主机只有tcp6没有tcp问题

    问题描述: Docker容器映射到宿主机后,查询端口连接只有tcp6没有tcp,通过ipv4地址连接时无法连接成功. 处理方法: 1.检查是否开启ipv4端口转发 sysctl net.ipv4.ip ...

  4. webpack4多页应用HTML按需添加入口依赖chunk【html-webpack-plugin & html-inline-entry-chunk-plugin】

    在webpack4中使用splitChunkPlugin时,根据需要将公共代码拆分为多个依赖后,需要在创建htmlWebpackPlugin时候按需引入对应入口文件依赖的chunk.但是html-we ...

  5. 函数的不同调用方式决定了this的指向不同

    一.函数的不同调用方式决定了this的指向不同,一般指向调用者 1.普通函数   this指向window的调用者        function fn(){            console.l ...

  6. flask之gevent-websocket的IO多路复用长连接通信

    本节目录: (一)笔记总结: (二)gevent-websocket+flask+javascript实现WS即时通信 (1)无昵称群聊 (2)有昵称群聊 (3)私聊 三种通信模型简述: (1)轮询: ...

  7. Kubeedge-mapper 实现

    应用场景: 利用GitHub上的温度传感器的例子作为讲解,实现从云端获取设备终端状态及使用Java模拟设备数据.其实和官网给的视频一样,只需要将终端设备的数据转换为支持MQTT协议传输的数据,云端就可 ...

  8. mouseover与mouseenter区别

    学习笔记. mouseover:在鼠标移入元素本身或者子元素时都会触发事件,相当于有一个冒泡过程.而且在鼠标移入子元素中时,父元素会显示离开的状态:相应的,当鼠标从子元素移入父元素,子元素也会显示离开 ...

  9. BZOJ4260异或和

    4260: Codechef REBXOR Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 918  Solved: 420[Submit][Statu ...

  10. HDU3829 Cat VS Dog

    题目链接:https://vjudge.net/problem/HDU-3829 题目大意: 有\(P\)个小孩,\(N\)只猫,\(M\)只狗.每个小孩都有自己喜欢的某一只宠物和讨厌的某一只宠物(其 ...