函数式接口

​ 函数式接口在java指定的是:有且仅有一个抽象方法的接口就称为函数式接口。

​ 函数式接口,设用于函数式编程的,在java当中的函数式编程体现在Lambda,所以函数式接口就是用来服务Lambda表达式。只有确定接口当中有且仅有一个抽象方法,java中的Lambda才能顺利进行推导

​ 备注: “语法糖"是指使用更加便利方便,但是原理不变的代码语法。就比如遍历集合时使用for-each语法,其实底层使用的是迭代器,这便是"语法糖”。

@Functionallnterface注解
与@Override注解作用类似,java 8 专门为函数式接口引入的一个新注解@FunctionalInterface,该注解主要定义在接口上。一旦在接口上使用该注解,编译期将会强制检查该接口是不是一个函数式接口,该接口中是不是有且仅有一个抽象方法,如果不是,编译报错

自定义函数式接口的用途
对于自定义的函数式接口,一般用于方法的参数和返回值上

格式:

修饰符 interface InterfaceName{// 只能定义一个抽象方法public abstract 返回值类型 方法名称(参数列表);// 还可以定义其他的非抽象方法
}

示例:

package com.hong.lambda;/*** @Author hongCheng* @Date 2021/4/25 15:54* @Version 1.0*/
public class InterfaceTest {public static void main(String[] args) {USB uPan = new USB() {@Overridepublic void show() {System.out.println("使用右眼");}};test(uPan);//改进①USB jianPan = () -> System.out.println("使用键盘");test(jianPan);//改进②test(() -> System.out.println("使用蓝牙"));}//函数时接口方式的应用:作为方法的参数, 调用方法可以使用lambda表达式public static void test(USB usb) {usb.show();}
}//函数式接口:接口中只有一个抽象方法,该接口就是函数式接口
@FunctionalInterface//检验该接口是否为函数式接口
interface USB {public void show();//JDK8以后新增的特性default void service() {}static void txt() {}
}

常见的函数式接口

  1. Comsumer

Consumer接口是一个类似消费者的接口,定义了一个名叫accept的抽象方法,它的入参是一个泛型T对象,没有任何返回值(void)

示例

package com.hong.interfacetest;import java.util.function.Consumer;/*** @Author hongCheng* @Date 2021/4/25 16:23* @Version 1.0*/
public class ConsumerInterfaceTest {public static void main(String[] args) {//方式一//MyConsumer<Double> consumer = new MyConsumer<>();System.out.println("====方式二====");System.out.println("lambda方式");Consumer<Double> consumer = new Consumer<Double>(){@Overridepublic void accept(Double aDouble) {System.out.println("今天消费了:"+aDouble);}};fun(consumer, 12.0);System.out.println("=====改进①=====");Consumer<Double> consumer1 = (Double aDouble) -> {System.out.println("今天消费了:"+aDouble);};fun(consumer1, 30.0);System.out.println("====改进②====");Consumer<Double> consumer2 = (Double aDouble)-> System.out.println("今天消费了"+aDouble);fun(consumer2,40.0);System.out.println("===改进③===");fun((Double aDouble)-> System.out.println("今天消费了:"+aDouble),80.0);}//消费型函数式接口public static void fun(Consumer<Double> consumer, Double param) {consumer.accept(param);}
}
//方式一
class MyConsumer<Double> implements Consumer<Double> {@Overridepublic void accept(Double aDouble) {System.out.println("我消费了:" + aDouble);}
}
  1. Supplier(无参有返回值)

Supplier接口是对象实例的提供者,定义了一个名叫get的抽象方法,它没有任何入参,并返回一个泛型T对象

示例:

package com.hong.interfacetest;import java.util.function.Supplier;/*** @Author hongCheng* @Date 2021/4/25 16:43* @Version 1.0*/
public class SupplierTest {public static void main(String[] args) {System.out.println("======方式①======");Supplier<String> supplier = new Supplier<String>() {@Overridepublic String get() {return "hello world!";}};String test = testSupplier(supplier);System.out.println(test);System.out.println("=====方式②=====");Supplier<String> supplier1 = ()->{return "Hello Java";};String test1 = testSupplier(supplier1);System.out.println(test1);System.out.println("=====方式③=====");Supplier<String> supplier2 = ()-> "Hello MySQL";String test2 = testSupplier(supplier2);System.out.println(test2);System.out.println("=====方式④=====");String test3 = testSupplier(()->"Hello Redis");System.out.println(test3);}//供给型函数式接口public static String testSupplier(Supplier<String> supplier) {return supplier.get();}
}
  1. Function(有参有返回值)

Function接口是对实例进行处理转换的接口,定义了一个名叫apply的抽象方法,它的入参是一个泛型T对象,并返回一个泛型T对象

示例:

package com.hong.interfacetest;import java.util.function.Function;/*** @Author hongCheng* @Date 2021/4/25 16:55* @Version 1.0*/
public class FunctiontTest {public static void main(String[] args) {System.out.println("====方式①====");Function<String, String> function = new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}};System.out.println(testFunction(function, "hello world!"));System.out.println("====方式②====");Function<String, String> function2 = (String s) -> {return s.toUpperCase();};System.out.println(testFunction(function2, "lili"));System.out.println("====方式③====");Function<String, String> function3 = s ->  s.toUpperCase();System.out.println(testFunction(function3, "hong"));System.out.println("====方式④====");System.out.println(testFunction(s ->  s.toUpperCase(), "cheng"));}//函数型接口public static String testFunction(Function<String, String> function, String str) {return function.apply(str);}
}
  1. Predicate

Predicate接口是判断是与否的接口,定义了一个名叫test的抽象方法,它的入参是一个泛型T对象,并返回一个boolean类型

示例:

package com.hong.interfacetest;import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;/*** @Author hongCheng* @Date 2021/4/25 17:11* @Version 1.0*/
public class PredicateTest {/*public static void main(String[] args) {Predicate<String> predicate = new Predicate<String>() {@Overridepublic boolean test(String s) {return s.length() > 5;}};System.out.println(testPredicate(predicate,"hong"));}//断言型接口public static Boolean testPredicate(Predicate<String> predicate,String str){return predicate.test(str);}*/public static void main(String[] args) {System.out.println("===方式①===");Predicate<String> predicate = new Predicate<String>() {@Overridepublic boolean test(String s) {return s.length() > 5;}};List<String> list = new ArrayList<>();list.add("zhangsan");list.add("lisi");list.add("wangwu");list.add("zhaosi");System.out.println(testPredicate(predicate, list));System.out.println("===方式②===");Predicate<String> predicate2 = (String s) -> {return s.length() > 5;};List<String> list2 = new ArrayList<>();list2.add("elema");list2.add("meituan");list2.add("bangbang");list2.add("zuoye");System.out.println(testPredicate(predicate2, list2));System.out.println("===方式③===");Predicate<String> predicate3 = s -> s.length() > 5;List<String> list3 = new ArrayList<>();list3.add("xigua");list3.add("lizi");list3.add("pingguo");System.out.println(testPredicate(predicate3, list3));}//断言型接口public static List<String> testPredicate(Predicate<String> predicate, List<String> list) {List<String> list1 = new ArrayList<>();for (int i = 0; i < list.size(); i++) {if (predicate.test(list.get(i))) {list1.add(list.get(i));}}return list1;}
}

JDK1.8新特性之函数式接口相关推荐

  1. JDK1.8新特性:函数式接口

    文章目录 函数式接口 函数式接口概念 @FunctionalInterface 函数式接口使用方式 常用函数式接口 Supplier Comsumer Predicate Function 常用函数式 ...

  2. JDK8新特性之函数式接口

    转载自 JDK8新特性之函数式接口 什么是函数式接口 先来看看传统的创建线程是怎么写的 Thread t1 = new Thread(new Runnable() {@Overridepublic v ...

  3. JAVA8的新特性之函数式接口

    JAVA8的新特性之函数式接口 1.Lambda表达式使用的前提,就是接口必须是一个函数式接口 2.定义 在接口中,只有一个抽象方法 3.检查是否是函数式接口用的注解 @FunctionalInter ...

  4. 【JavaSE】JDK新特性(二)————接口新特性,函数式接口(Suppier,Comsumer,Predicate,Function)

    文章目录 1.接口新特性 1.1 接口组成更新概述 1.2 接口中的默认方法 1.3 接口中的静态方法 1.4 接口中的私有方法 2. 函数式接口 2.1 函数式接口概述 2.2 函数式接口作为方法的 ...

  5. Java8新特性之函数式接口,呦呦呦

    什么时候可以使用 Lambda?通常 Lambda 表达式是用在函数式接口上使用的.从 Java8 开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个 ...

  6. Java8新特性之函数式接口

    一.函数接口 Lambda的设计者们为了让现有的功能与Lambda表达式良好兼容,考虑了很多方法,于是产生了函数接口这个概念.函数接口指的是只有一个函数的接口,这样的接口可以隐式转换为Lambda表达 ...

  7. JDK8新特性:函数式接口@FunctionalInterface的使用说明

    我们常用的一些接口Callable.Runnable.Comparator等在JDK8中都添加了@FunctionalInterface注解. 通过JDK8源码javadoc,可以知道这个注解有以下特 ...

  8. 【Java】JDK8新特性之函数式接口

    原文:http://www.javastack.cn/article/2017/jdk8-new-feature-functional-interface/ 什么是函数式接口 先来看看传统的创建线程是 ...

  9. jdk8 新特性之 函数式接口

    一.函数式接口说明 1.函数式接口条件 (1).只包含一个抽象方法的接口,称为函数式接口. (2).你可以通过Lambda表达式来创建该接口的对象.(若Lambda表达式抛出一个受检异常,那么该异常需 ...

最新文章

  1. RedHat Enterprise 5.1下OpenLDAP的配置及PAMNSS的配置
  2. springboot 开发入门,及问题汇总
  3. Dws同步mysql数据_数据库技术丨GaussDB(DWS)数据同步状态查看方法
  4. 移动服务安全现状分析!
  5. python个人收支管理系统相关题目_练手题:计算人均付费(SQLPython)
  6. 初学docker容器
  7. C++设计模式-观察者模式
  8. Docker Engine在CentOS上的安装
  9. 基于Android系统的IPv6网络接入分析
  10. Java url转MultipartFile inputStream转File file转multipartFile
  11. Android 实现一键加QQ群,一键加QQ好友
  12. 2020-02-28
  13. 阿里字体库的运用(网站上面的购物车或者一些小图标 箭头)
  14. 数字电路设计之低功耗设计方法六:旁路(by-passing)
  15. 房地产企业与项目管理
  16. 开源海思开发板(HIVIEW开发板)
  17. m1/m1Pro/m1Max芯片下载win11-arm镜像
  18. 八一、 mpvue-使用介绍(美团团队开发的语法类似 vue的小程序的前端框架)
  19. nyoj 1248 海岛争霸 (并查集)
  20. 百度地图自定义Marker

热门文章

  1. 最近看了 北爱(北京爱情故事)
  2. com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct (no Creators)
  3. 秋招面试题(360)
  4. 将MacbookPro作为电脑音箱的方法
  5. 7.3国服人口最多的服务器,魔兽国服人口普查:总人口稳定 双阵营法师增长
  6. 微信和支付宝的服务器在哪里,手机恢复出厂设置,里面支付宝与微信怎么办?原来数据在这里...
  7. 如何在当今的网络上构建VR
  8. 小学计算机课家长评语,小学家长简短的评语大全
  9. canvas制作火焰的两种方法
  10. 线性正切制导 matlab编程实现,数学建模之MATLAB编程