java8学习教程之函数引用的使用方法

作者:daisy 时间:2023-08-28 12:03:19 

前言

我们在上一篇文章 中以实例讲解如何定义和使用 lambda 表达式,以及与其它语言相比,lambda 表达式在 Java 中的特殊规范。并且提到,lambda 表达式可以进一步简化为函数引用。

这篇文章将介绍如何使用函数引用,话不多说了,来一起看看详细的介绍吧。

函数引用的类型

函数引用分为以下四种:

  • 静态函数,比如 Integer 类的 parseInt 函数,可以写作 Integer::parseInt

  • 对象级别函数的引用,比如 String 类的 length 函数,可以写作 String::length

  • 具体实例的函数的引用,比如名称为 expensiveTransaction 的一个实例的 getValue,写作 expensiveTransaction::getValue

  • 构造函数的引用

静态函数

比如:


Function<String, Integer> stringToInteger = (String s) -> Integer.parseInt(s);

可以写作:


Function<String, Integer> stringToInteger = Integer::parseInt;

对象级别函数的引用


BiPredicate<List<String>, String> contains =
(list, element) -> list.contains(element);

可以写作:


BiPredicate<List<String>, String> contains = List::contains;

构造函数的引用

下面再举一个构造函数的例子, 首先定义一个函数式接口,唯一的方法 get 返回指定类型的对象。


@FunctionalInterface
public interface Supplier<T> {
T get();
}

Supplier<TantanitReader> constructor = () -> new TantanitReader();
TantanitReader tantanitReader = constructor.get();

上述代码的 lambda 表达式 new 并返回一个新的对象,使得 constructor 变量成为一个构造器的引用。

等价于以下函数引用:


Supplier<TantanitReader> constructor2 = TantanitReader::new;
TantanitReader tantanitReader2 = constructor2.get();

以上的例子都是没有参数的情况,下面仍然以构造函数为例,介绍有参数的情况:


public TantanitReader(String loginName) {
this.loginName = loginName;
}

Function<String,TantanitReader> constructor3 = (loginName) -> new TantanitReader(loginName);
TantanitReader tantanitReader3 = constructor3.apply("jack");

Function<String,TantanitReader> constructor4 = TantanitReader::new;
TantanitReader tantanitReader4 = constructor4.apply("jack");
TantanitReader tantanitReader5 = constructor4.apply("tom");

这时由于函数只有一个参数,可以使用 Java 自带的 Function这个函数式接口,它实际起作用的函数如下:


R apply(T t);

作用为根据一个参数,返回一个结果。我们由此可以使用 constructor4 以及相应的函数引用 constructor5。

小结

使用函数引用不仅可以简化 lambda 表达式,而且在语义上可以更加专注于方法名称,也就是要做的事,抽象级别更加接近人类的认知。所以,应当尽可能使用函数引用。

来源:http://tantanit.com/java-how-to-use-method-reference/

标签:java8,函数引用
0
投稿

猜你喜欢

  • C# DataSet的内容写成XML时如何格式化字段数据

    2023-04-14 09:01:28
  • C#删除只读文件或文件夹(解决File.Delete无法删除文件)

    2022-06-30 15:01:59
  • Android RecyclerView详解之实现 ListView GridView瀑布流效果

    2023-11-26 10:09:00
  • springboot 整合 sa-token简介及入门教程

    2023-03-24 01:10:45
  • java编程之AC自动机工作原理与实现代码

    2023-04-04 19:11:23
  • 使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

    2023-04-24 07:35:45
  • Java实现word/pdf转html并在线预览

    2022-09-09 09:16:49
  • 布隆过滤器面试如何快速判断元素是否在集合里

    2022-10-17 15:55:19
  • 利用Matlab复刻羊了个羊小游戏

    2021-10-10 17:13:05
  • java合并多个文件的实例代码

    2023-07-28 12:56:02
  • Java基础之Spring5的核心之一IOC容器

    2022-06-04 07:44:14
  • android中实现指针滑动的动态效果方法

    2023-10-07 15:54:44
  • C#编程简单实现生成PDF文档的方法示例

    2023-09-26 05:36:32
  • Android开发之绘制平面上的多边形功能分析

    2023-12-13 13:31:57
  • 详解C#中使用对象或集合的初始值设定项初始化的操作

    2021-12-25 20:04:52
  • Android图片处理工具类BitmapUtils

    2022-12-28 05:23:39
  • C#实现插入排序

    2023-07-02 13:16:58
  • Spring JPA之save方法示例详解

    2023-09-06 15:50:35
  • java 安全 ysoserial CommonsCollections6 分析

    2021-06-04 01:58:14
  • Java生成压缩文件的实例代码

    2023-02-04 21:11:09
  • asp之家 软件编程 m.aspxhome.com