广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java 中的函数式接口
  • 171
分享到

详解Java 中的函数式接口

2024-04-02 19:04:59 171人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录@FunctionalInterface注解最简单的函数式接口基础数据类型的函数表达式二元输入参数的函数Two-ArityFunctionSpecializationsSuppl

@FunctionalInterface注解

如果你想自己定义个新的函数式接口,强烈建议你加上*@FunctionalInterface* 注解。可以更好地揭示我们定义这个接口的意思,同时也可以让编译器帮助我们检查接口定义的正确与否。在任何情况下,我们将一个接口只有一个抽象方法的接口都认为是函数是接口。这样的接口实现,才可以被看成是 lambda 的表达式。可能你会说,不对啊,明明我看到很多函数式接口是包含了多个方法的。这里需要说明一点的是,函数式接口只能有一个抽象方法,但是可以有多个默认实现的方法。

最简单的函数式接口

通常情况下,我们满足数据的映射,那就是输入一个数据,映射(对应)输出一个数据。


public interface Function<T, R> { … }	

比如,我们调用Map 方法中computeIfAbsent 方法来实现,当我们尝试获取 key 值为 John 的值是,如果不存在,则我们生成一个(key,key.length())的数据。


Map<String, Integer> nameMap = new HashMap<>();
Integer value = nameMap.computeIfAbsent("John", s -> s.length());

当然也可以采用冒号的语法糖


Integer value = nameMap.computeIfAbsent("John", String::length);

函数式接口含有一个compose 方法来组合 多个函数表达式。(类似于数学中嵌套表达式,y=f1(f2(x))


Function<Integer, String> intToString = Object::toString;
Function<String, String> quote = s -> "'" + s + "'";
Function<Integer, String> quoteIntToString = quote.compose(intToString);
assertEquals("'5'", quoteIntToString.apply(5));

其中第一个函数表达式是,将对象转换为字符串,第二个则是对字符串加上双引号。

基础数据类型的函数表达式

jdk 的 Function 包下的有很多基础类型的函数方法接口,但是这些接口都不是可以直接使用的,都需要自己实现。

  • IntFunction, LongFunction, DoubleFunction: 输入是具体的(Int,Long,Double),但是输出是可以指定的。
  • ToIntFunction, ToLongFunction, ToDoubleFunction: 输入是可以自定义的,输出是具体的(int,Long,Double)。
  • DoubleToIntFunction, DoubleToLongFunction, IntToDoubleFunction, IntToLongFunction, LongToIntFunction, LongToDoubleFunction: 输入和输出都是指定的基础数据类型。

下面让我们根据一个输入 Short 然后输出 Byte 数据类型,来说明用法。java.util.function 下不含这两个数据类型映射。

我们先定义一个函数式接口,从 Short 类型映射到 Byte 类型。


@FunctionalInterface
public interface ShortToByteFunction {
    byte applyAsByte(short s);
}

比如,我们实现如下的逻辑,输入一个 short 类型的数组,然后每个元素都应用我们定义函数式方法实现。


public byte[] transfORMArray(short[] array, ShortToByteFunction function) {
    byte[] transformedArray = new byte[array.length];
    for (int i = 0; i < array.length; i++) {
        transformedArray[i] = function.applyAsByte(array[i]);
    }
    return transformedArray;
}

然后 每个元素的逻辑,通过 lambda 来具体实现。比如,每个 将每个 short 类型都乘以 2 再转换成 Byte。


short[] array = {(short) 1, (short) 2, (short) 3};
byte[] transformedArray = transformArray(array, s -> (byte) (s * 2));
byte[] expectedArray = {(byte) 2, (byte) 4, (byte) 6};
assertArrayEquals(expectedArray, transformedArray);

二元输入参数的函数 Two-Arity Function Specializations

也就是输入两个不同的参数,输出一个指定数据类型的函数。在 JDK 中,带有 Bi 名称的就是类型。比如BiFunction, ToDoubleBiFunction, ToIntBiFunction, and ToLongBiFunction.

一个典型的用法,就是 Map 中的 replaceAll 方法。


Map<String, Integer> salaries = new HashMap<>();
salaries.put("John", 40000);
salaries.put("Freddy", 30000);
salaries.put("Samuel", 50000);
salaries.replaceAll((name, oldValue) -> 
  name.equals("Freddy") ? oldValue : oldValue + 10000);

其中,将 map 中每个元素 (key,value) 都引用 lambda 中函数表达式来重新应用。

Suppliers 供给型接口 & Consumers 消费型接口

可以理解为一个生产者,通常没有输入,但是能够更具特定规则输出数据(元素)。典型的应用就是一个序列生成器。JDK 里面有更丰富接口定义,如BooleanSupplier, DoubleSupplier, LongSupplier 和 IntSupplier.


int[] fibs = {0, 1};
Stream<Integer> fibonacci = Stream.generate(() -> {
    int result = fibs[1];
    int fib3 = fibs[0] + fibs[1];
    fibs[0] = fibs[1];
    fibs[1] = fib3;
    return result;
});

与Supplier 对应的 Consumer,接收一个输入参数,但是不返回任何数据类型。最常用的就是实现 foreach 中的消费每个迭代元素。


List<String> names = Arrays.asList("John", "Freddy", "Samuel");
names.forEach(name -> System.out.println("Hello, " + name));

Predicates 断言型接口

通常理解,该接口会返回 True 或 False 的数据类型,常见的就是 Stream 中的 Filter 接口实现的逻辑。

Operators

该函数式接口主要就是,输入一个数据类型,返回同样的数据类型。


names.replaceAll(String::toUpperCase);

有一个例外,就是 BinaryOperator 函数式接口是一个归并操作,汇聚和输入的列表元素。典型的入 reduce 函数。


List<Integer> values = Arrays.asList(3, 5, 8, 9, 12);
int sum = values.stream()
  .reduce(0, (i1, i2) -> i1 + i2);

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 详解Java 中的函数式接口

本文链接: https://www.lsjlt.com/news/160613.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Java 中的函数式接口
    目录@FunctionalInterface注解最简单的函数式接口基础数据类型的函数表达式二元输入参数的函数Two-ArityFunctionSpecializationsSuppl...
    99+
    2022-11-12
  • 【Java 基础篇】Java 函数式接口详解
    文章目录 导言一、函数式接口的概念二、函数式接口的语法三、函数式接口的使用方法四、常用的函数式接口总结 导言 函数式接口是 Java 8 引入的重要特性,它允许将函数作为参数传递给方法,或者作为返回值返回。函数式接口主要用于...
    99+
    2023-08-16
    java jvm 开发语言
  • 详细介绍Java函数式接口
    目录Java—函数式接口1.自定义函数式接口1.1概述1.2格式1.3@FunctionalInterface注解1.4自定义函数式接口2.函数式编程2.1Lambda的延迟执行2....
    99+
    2022-11-12
  • java之函数式接口解读
    目录一、函数式接口@FunctionalInterface注解性能浪费的日志案例使用Lambda优化日志案例使用Lambda作为参数和返回值二、常用函数式接口Supplier接口Co...
    99+
    2023-03-01
    java函数式接口 java接口 函数式接口
  • 详解如何熟练使用java函数式接口
    一、函数式接口的由来 我们知道使用Lambda表达式的前提是需要有函数式接口,而Lambda表达式使用时不关心接口名,抽象方法名。只关心抽象方法的参数列表和返回值类型。因此为了让我们...
    99+
    2022-11-12
  • JAVALambda表达式与函数式接口详解
    Lambda表达式的诞生是为了解决JAVA创建匿名内部类代码冗余的问题。例子如下: public class Lambda { public static void main...
    99+
    2022-11-13
  • java中有哪些函数式接口
    java中有哪些函数式接口?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spring Web MVC是一种基于J...
    99+
    2023-06-14
  • java中什么是函数式接口
    这篇文章给大家介绍java中什么是函数式接口,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、浮点类型,用来表示小数的数据类型...
    99+
    2023-06-14
  • java提供的4种函数式接口
    目录1、什么是函数式接口2.java提供四种类型的函数式接口1、什么是函数式接口 函数接口是只有一个抽象方法的接口,用作 Lambda 表达式的类型。使用@FunctionalInt...
    99+
    2022-11-13
  • java中有哪些内置函数式接口
    这篇文章给大家介绍java中有哪些内置函数式接口,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. 分布性,Jav...
    99+
    2023-06-14
  • Java中Future接口详解
    目录一、背景二、Future接口1、入门案例2、Future接口三、CompletableFuture类1、基础说明2、核心方法2.1 实例方法2.2 计算方法2.3 结果获取方法2...
    99+
    2023-05-16
    Java中Future接口 Java Future
  • Java Lambda表达式常用的函数式接口
    目录Supplier接口Consumer接口Predicate接口Function接口BiFunction接口基本数据类型Supplier相关的接口Consumer相关的接口Pred...
    99+
    2022-11-13
  • 《Java 基础篇》之函数式接口
    目录 1、函数式接口概述 2、函数式接口做为方法的参数 3、函数式接口作为方法的返回值 3、常用的函数式接口 3.1、Supplier [səˈplaɪə(r)] Supplier接口 3.2、Consumer接口 3.3、Predicat...
    99+
    2023-10-20
    java 开发语言
  • java函数式接口怎么应用
    这篇文章主要介绍了java函数式接口怎么应用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java函数式接口怎么应用文章都会有所收获,下面我们一起来看看吧。一、函数式接口概念函数式接口在Java中是指:有且仅有...
    99+
    2023-07-05
  • Java常用函数式接口总结
    四大函数式接口 新时代的程序员:lambda 表达式,链式编程,函数式接口,Stream 流式计算 函数式接口: 只有一个方法的接口 @FunctionalInterface...
    99+
    2022-11-12
  • 如何使用java函数式接口
    这篇文章主要介绍了如何使用java函数式接口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、函数式接口的由来我们知道使用Lambda表达式的前提是需要有函数式接口,而Lam...
    99+
    2023-06-15
  • 【Java系列】函数式接口编程
    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,...
    99+
    2023-12-23
    java 开发语言
  • Java中接口的多态详解
    目录多态参数多态数组接口的多态传递现象总结多态参数 就像我们现实生活中电脑的usb接口,我们既可以接受手机对象,又可以接受相机对象,等等,体现了接口的多态,查看以下代码 接口: pa...
    99+
    2022-11-13
  • Java中接口的深入详解
    目录一、前言二、接口接口的格式三、接口的特点接口的使用四、类与接口的关系接口多重继承的好处练习总结一、前言 前面我们说了抽象类的概述,我们对抽象类也有个认识和理解了,现在我们学习十分...
    99+
    2022-11-12
  • java内置的函数式接口怎么用
    这篇文章主要介绍了java内置的函数式接口怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java内置的函数式接口怎么用文章都会有所收获,下面我们一起来看看吧。1、Predicate是参数的布尔函数。该接口...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作