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

 更新时间:2020年05月13日 14:26:31   作者:Harvey  
这篇文章主要介绍了JDK都出到14了,你有什么理由不会函数式编程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

函数式接口

先看一下官方定义

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 函数式编程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决mybatis用Map返回的字段全变大写的问题

    解决mybatis用Map返回的字段全变大写的问题

    这篇文章主要介绍了解决mybatis用Map返回的字段全变大写的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • JAVA如何使用Math类操作数据

    JAVA如何使用Math类操作数据

    这篇文章主要介绍了JAVA如何使用Math类操作数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-04-04
  • java多线程从入门到精通看这篇就够了

    java多线程从入门到精通看这篇就够了

    熟悉 Java 多线程编程的同学都知道,当我们线程创建过多时,容易引发内存溢出,因此我们就有必要使用线程池的技术了,今天通过本文给大家分享java多线程从入门到精通的相关知识,一起看看吧
    2021-06-06
  • Java小程序赛马游戏实现过程详解

    Java小程序赛马游戏实现过程详解

    这篇文章主要介绍了Java小程序赛马游戏实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Spring IoC学习之ApplicationContext中refresh过程详解

    Spring IoC学习之ApplicationContext中refresh过程详解

    这篇文章主要给大家介绍了关于Spring IoC学习之ApplicationContext中refresh过程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 让Java程序自动重启的实现方法(推荐)

    让Java程序自动重启的实现方法(推荐)

    下面小编就为大家带来一篇让Java程序自动重启的实现方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • IDEA 使用mybatis插件Free Mybatis plugin的步骤(推荐)

    IDEA 使用mybatis插件Free Mybatis plugin的步骤(推荐)

    这篇文章主要介绍了IDEA 使用mybatis插件Free Mybatis plugin的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Spring RabbitMQ死信机制原理实例详解

    Spring RabbitMQ死信机制原理实例详解

    这篇文章主要介绍了Spring RabbitMQ死信机制原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 详解Netty编码器和解码器

    详解Netty编码器和解码器

    很多小伙伴对Netty编解码器这方面不是很了解,今天这篇文章给大家详细介绍了Netty编码器和解码器的相关知识,需要的朋友可以参考下
    2021-06-06
  • Java利用POI读取、写入Excel的方法指南

    Java利用POI读取、写入Excel的方法指南

    这篇文章主要给大家介绍了关于Java利用POI读取、写入Excel的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03

最新评论