JDK都出到14了,你有什么理由不会函数式编程(推荐)

 更新时间:2020年5月14日 08:19  点击:1944

函数式接口

先看一下官方定义

Functional interfaces provide target types for lambda expressions and method references.

可以看出函数式接口主要用于lambda表达式,这类接口只定义了唯一的抽象方法的接口(除了隐含的Object对象的公共方法),一开始也称SAM类型接口(Single Abstract Method)。

简单使用

List<Integer> list = Lists.newArrayList(1,2,3);
    list.forEach(r -> {
      System.out.println("re = " + Math.sqrt(r));
    });

看一下 foreach 实现,在Iterable.java

default void forEach(Consumer<? super T> action) {
    Objects.requireNonNull(action);
    for (T t : this) {
      action.accept(t);
    }
  }

这里出现的Consumer就是一个函数式接口, java8 提供了一些常用的函数式接口

  1. Predicate -- 传入一个参数,返回一个bool结果, 方法为boolean test(T t)
  2. Consumer -- 传入一个参数,无返回值,纯消费。 方法为void accept(T t)
  3. Function -- 传入一个参数,返回一个结果,方法为R apply(T t)
  4. Supplier -- 无参数传入,返回一个结果,方法为T get()
  5. UnaryOperator -- 一元操作符, 继承Function,传入参数的类型和返回类型相同。
  6. BinaryOperator -- 二元操作符, 传入的两个参数的类型和返回类型相同, 继承BiFunction

这里就不一一列举了,具体请见 java.util.function 包 都很简单,不太清楚的自行google

扩展

但是jdk提供的有时候不一定能满足需求,这个时候就需要我们自定义函数式接口

1.普通的 Function 或者 Consumer 只能就收一个参数,BiFuntion 和 BiConsumer 也只能接受连个参数,参数更多的情况就无法满足了

以 consumer 为例,先自定义一个接口

@FunctionalInterface
  public interface TriConsumer<T, U, W> {
    void accept(T t, U u, W w);

    default TriConsumer<T, U, W> andThen(TriConsumer<? super T, ? super U, ? super W> after) {
      Objects.requireNonNull(after);

      return (l, r, w) -> {
        accept(l, r, w);
        after.accept(l, r, w);
      };
    }
  }

函数式接口一般使用 @FunctionalInterface 注解注释,以申明该接口是一个函数式接口, 这里提供一个 andThen 方法以支持连续调用

使用方法

TriConsumer<Integer, Integer, Integer> consumer = (a, b, c) -> {
      System.out.println(a + b + c);
    };
    consumer.accept(5,6,7);

funtion类似,这里就不举例了

2.异常捕获

FunctionalInterface 提供的接口一般是不抛出异常的,意味着我们在使用的时候需要在方法体内部捕获异常,这里定义一种可以抛出异常的接口

@FunctionalInterface
  public interface InterfaceException<T> {
    void apply(T t) throws Exception;
  }

总结

到此这篇关于JDK都出到14了,你有什么理由不会函数式编程(推荐)的文章就介绍到这了,更多相关jdk 函数式编程内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

[!--infotagslink--]

相关文章

  • Docker 解决openjdk容器里无法使用JDK的jmap等命令问题

    这篇文章主要介绍了Docker 解决openjdk容器里无法使用JDK的jmap等命令问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
  • eclipse汉化及jdk安装环境配置超详细教程(Java安装教程)

    这篇文章主要介绍了eclipse汉化及jdk安装环境配置超详细教程(Java安装教程),本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-11
  • C#函数式编程中的惰性求值详解

    这篇文章主要介绍了C#函数式编程中的惰性求值详解,本文讲解了惰性求值的相关知识并给出代码实例,需要的朋友可以参考下...2020-06-25
  • C#温故而知新系列教程之闭包

    闭包是将一些执行语句的封装,可以将封装的结果像对象一样传递,在传递时,这个封装依然能够访问到原上下文。下面这篇文章主要给大家介绍了关于C#中闭包的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下...2020-06-25
  • Java 函数式编程要点总结

    函数式编程并不是Java新提出的概念,其与指令编程相比,强调函数的计算比指令的计算更重要;与过程化编程相比,其中函数的计算可以随时调用。Java8新引入函数式编程方式,大大的提高了编码效率。本文将对涉及的对象等进行统一的学习及记录。...2021-06-18
  • C#函数式编程中的递归调用之尾递归详解

    这篇文章主要介绍了C#函数式编程中的递归调用详解,本文讲解了什么是尾递归、尾递归的多种方式、尾递归的代码实例等内容,需要的朋友可以参考下...2020-06-25
  • idea 实现搜索jdk中的类和包操作

    这篇文章主要介绍了idea 实现搜索jdk中的类和包操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-08
  • 批处理一键安装JDK/一键安装JRE和自动配置Java环境变量

    对于java或安卓初学者来说,配置java环境变量是一件比较头疼的事情,在此我向大家分享一个一键安装JDK和自动配置java环境变量的bat批处理方法,需要的朋友可以参考下...2020-06-30
  • Mac系统搭建JDK及JMETER过程解析

    这篇文章主要介绍了Mac系统搭建JDK及JMETER过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-08-14
  • C#函数式编程中的标准高阶函数详解

    这篇文章主要介绍了C#函数式编程中的标准高阶函数详解,本文讲解了何为高阶函数、Map、 Filter、Fold等内容,需要的朋友可以参考下...2020-06-25
  • 关于JDK+Tomcat+eclipse+MyEclipse的配置方法,看这篇够了

    关于JDK+Tomcat+eclipse+MyEclipse的配置问题,很多朋友都搞不太明白,网上一搜配置方法多种哪种最精简呢,今天小编给大家分享一篇文章帮助大家快速掌握JDK Tomcat eclipse MyEclipse配置技巧,需要的朋友参考下吧...2021-06-19
  • OpenJDK源码解析之System.out.println详解

    这篇文章主要介绍了OpenJDK源码解析之System.out.println详解,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-25
  • win2003 jsp运行环境架设心得(jdk+tomcat)

    这几天一直研究架设JSP服务器,之前一切都是默认安装,能成功;能看到一只猫,可真正要上线时,要实现多站点就一直404不行;不知道百度跟google将近一天都不行,看了N多网页尝试不行...2016-01-27
  • JDK都出到14了,你有什么理由不会函数式编程(推荐)

    这篇文章主要介绍了JDK都出到14了,你有什么理由不会函数式编程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-14
  • Java8新特性:函数式编程

    Java8最新引入函数式编程概念,该项技术可以大大提升编码效率,本文会对涉及的对象等进行两种方法的对比,对新技术更直白的看到变化,更方便学习...2021-06-22
  • C#函数式编程中的部分应用详解

    这篇文章主要介绍了C#函数式编程中的部分应用详解,本文讲解了何谓函数式编程、函数式编程中的部分应用是什么、部分应用的代码实例,需要的朋友可以参考下...2020-06-25
  • 详解SPI在Dubbo中的应用

    通过本文的学习,可以了解 Dubbo SPI 的特性及实现原理,希望对大家的开发设计有一定的启发性...2021-06-17
  • JDK源码Enum类原理及代码实例解析

    这篇文章主要介绍了JDK源码Enum类原理及代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-11-16
  • 麒麟V10更换OpenJDK为Oracle JDK的方法

    这篇文章主要介绍了麒麟V10更换OpenJDK为Oracle JDK,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-30
  • shell脚本自动化创建虚拟机的基本配置之tomcat--mysql--jdk--maven

    这篇文章主要介绍了shell脚本自动化创建虚拟机的基本配置之tomcat--mysql--jdk--maven的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11