一、函数式接口概述

函数式接口:有且仅有一个抽象方法的接口。
Java中的函数式编程体现就是Lambda表达式,所以函数式接口就是可以适用于
Lambda表达式使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的
Lambda表达式才能顺利地进行推导。可以在接口定义的上方加上一个注解@FunctionalInterface来表示该接口是一个
函数式接口。如下所示:
@FunctionalInterface
public interface MyInterface {void show();
}

二、常用的四种函数式接口

1、Supplier接口
Supplier<T>接口包含了一个无参的方法:
(1)T get():获得结果,该方法不需要参数,它会根据某种逻辑返回一个数据。Supplier<T>接口也被称作生产性接口,get方法返回的数据类型和泛型中指定的数据类型一致。
例如:
public static void main(String[] args) {//Lambda表达式String s1 = getString(() -> "asdf");System.out.println(s1);//Lambda表达式int i = getInteger(() -> 2);System.out.println(i);}//定义一个方法返回整数private static Integer getInteger(Supplier<Integer> s) {return s.get();}//定义一个方法返回字符串数据private static String getString(Supplier<String> s) {return s.get();}
2、Consumer接口
Consumer<T>接口包含两个方法:
(1)void accept(T t):对给定的参数进行操作
(2)default Consumer<T> andThen(Consumer after):返回一个组合Consumer
依次执行此操作然后执行after操作。Consumer<T>接口也被称作消费接口,消费的数据类型由泛型决定。
public static void main(String[] args) {operatorString("杨玉环", s -> System.out.println(new StringBuilder(s).reverse()));System.out.println("-----------");operatorString("王昭君", s -> System.out.println(new StringBuilder(s).reverse()), s -> System.out.println(s));}//定义一个方法消费字符串,用不同的方式消费同一个字符串两次private static void operatorString(String s, Consumer<String> c1, Consumer<String> c2) {//        c1.accept(s);
//        c2.accept(s);c1.andThen(c2).accept(s);}//定义一个方法消费字符串private static void operatorString(String s, Consumer<String> c) {c.accept(s);}
运行结果:环玉杨-----------君昭王王昭君

3、Predicate接口
Predicate<T>接口常用的有四个方法:
(1) boolean test(T t) 对给定参数进行判断,返回一个布尔值
(2) default Predicate<T> negate() 返回一个逻辑的否定,对应逻辑非
(3) default Predicate<T>  and(Predicate other) 返回一个组合判断,对
应短路与。
(4) default Predicate<T> or(Predicate other) 返回一个组合判断,对
应短路或。
public static void main(String[] args) {boolean b = checkString("aa", s1 -> s1.equals("aa"));System.out.println(b);boolean b1 = checkString("hello", s1 -> s1.length() > 3);System.out.println(b1);System.out.println("=============");boolean b2 = checkString("helloworld", s1 -> s1.equals("aa"), s2 -> s2.length() > 12);System.out.println(b2);}//判断给定的字符串是否满足要求private static boolean checkString(String s, Predicate<String> p) {//        return p.test(s);return p.negate().test(s);}//同一个字符串给出两个不同的判断,最后把这两个判断的结果做逻辑与运算的结果作为最终结果private static boolean checkString(String s, Predicate<String> p1, Predicate<String> p2) {//        boolean b1 = p1.test(s);
//        boolean b2 = p2.test(s);
//
//        return b1 && b2;
//        return p1.and(p2).test(s);return p1.or(p2).test(s);}
4、Function接口
Function<T,R>接口有两个常用方法:
(1) R apply(Function<T,R>) 将此函数应用于给定的参数
(2)default <V> Function<T,​V>   andThen​(Function<? super R,​? extends V> after)
返回首先将此函数应用于其输入的 after函数,然后将 after函数应用于结果。Function<T,R>接口常用于对参数进行操作转换,然后返回一个新的值。
public static void main(String[] args) {convert("1000", s -> Integer.parseInt(s));convert(100, s1 -> String.valueOf(s1));convert("200", s -> Integer.parseInt(s), s2->String.valueOf(s2+100));}//定义一个方法把字符串类型转换成int类型并输出private static void convert(String s, Function<String, Integer> f) {Integer i = f.apply(s);System.out.println(i);}//定义一个方法,把一个int类型的数加上一个整数后转换成字符串后输出private static void convert(Integer i, Function<Integer, String> f) {int result = i + 100;String s = f.apply(result);System.out.println(s);}//定义一个方法把一个字符串转换成int类型,把int加上一个整数后,转换成字符串private static void convert(String s, Function<String, Integer> f1, Function<Integer, String> f2) {String apply = f1.andThen(f2).apply(s);System.out.println(apply);}

Java学习笔记——函数式接口相关推荐

  1. Java学习笔记004——接口、克隆、回调、内部类

    接口 1.接口不是类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义 2.定义接口,如: public interface Abc{ int aaa(Object other) } 3 ...

  2. JAVA学习笔记 15 - 函数式接口、Lambda表达式和方法引用

    本文是Java基础课程的第十五课.主要介绍在JDK8中,Java引入的部分新特性,包括函数式接口.Lambda表达式和方法引用.这些新特性使得Java能够在按照面向对象思想进行开发的基础上,融合函数式 ...

  3. java学习笔记day09 final、多态、抽象类、接口

    java学习笔记day09 思维导图 final . 多态 . 抽象类 . 接口 (都很重要) 一.final 二.多态 多态中的成员访问特点⭐ [P237] 多态的好处 [P239] 多态的弊端 向 ...

  4. Java学习笔记(四)——接口

    Java学习笔记(四)--接口 1.格式 2.接口的特点 3.接口举例 1.格式 接口:初期理解,可以认为是一个特殊的抽象类.当抽象类中的方法都是抽象的,那么该类 可以通过接口的方式来表示. clas ...

  5. 2022年Java学习笔记目录

    一.2022年Java任务驱动课程 任务驱动,统摄知识点:2022年Java程序设计讲课笔记 二.2022年Java学习笔记 (一)踏上Java开发之旅 Java学习笔记1.1.1 搭建Java开发环 ...

  6. java学习笔记11--Annotation

    java学习笔记11--Annotation Annotation:在JDK1.5之后增加的一个新特性,这种特性被称为元数据特性,在JDK1.5之后称为注释,即:使用注释的方式加入一些程序的信息. j ...

  7. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  8. java学习笔记16--I/O流和文件

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note16.html,转载请注明源地址. IO(Input  Output)流 IO流用来处理 ...

  9. java学习笔记14--多线程编程基础1

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...

最新文章

  1. 吊打一切的YOLOv4的tricks汇总!附参考论文下载
  2. vb.net 功能f8键事件_Excel中F1~F12所有功能键作用,你知道吗?
  3. hdu 5325 Crazy Bobo dfs
  4. shell--变量的替换
  5. C# 操纵 Excel(tlbimp.exe)
  6. 阿里《Java手册》做一个有技术情怀的人
  7. Linux之防火墙开通端口
  8. 【Flink】Flink UpsertStreamTableSink requires that has a full primary keys if update
  9. 台式机安装Linux系统
  10. 登录Windows Server时提示”user profile service服务器登录失败 无法加载用户配置“的解决方法
  11. vue-tippy优秀悬浮框插件的两种使用方式(解决elementui的tooltip不及时消失及定位出错问题,使用el-progress进度条模仿柱状图,tippy模仿echarts悬浮框)
  12. NCM格式如何转换为Mp3(简单快速)
  13. 网路新年贺词_文伟_新浪博客
  14. iOS MVVM + RxSwift 关键词zip 的调用时机问题
  15. iOS开发之制作越狱ios设备ipa包
  16. python求斜边上的高是多少厘米_已知一个直角三角形的两条直角边,如何求斜边上的高的长度...
  17. 如何在面试中介绍自己的项目经验(作者原创版)
  18. 【电路设计】晶振选择和负载容抗匹配参考指南
  19. 均值滤波,中值滤波,最大最小值滤波
  20. urovo手持终重启_手持终端设备常见问题及维修方法

热门文章

  1. mybatis-plus 查询,删除
  2. Java hashCode() 和 equals()使用的场景
  3. Mybatis注解开发之@Results
  4. JulyNovel-React
  5. 解密SVM系列(二):SVM的理论基础(转载)
  6. mysql索引原理剖析
  7. 【vue系列之二】详解vue-cli 2.0配置文件
  8. __dopostback
  9. 63. Unique Paths II and 64. Minimum Path Sum
  10. 东风小康为什么是dfsk_助力地摊经济瑞驰纯电动物流车和东风小康微型货车厚积薄发...