Java中函数式编程2

Java中的函数参数

在Java中,函数参数有以下三种形式:

  • lambda表达式。
  • 方法引用。
  • 匿名内部类。

函数参数无论怎么表示,其原则为:1. 参数列表和返回值类型 与 要表示的抽象函数的相同。2. 方法体内部如果要使用外部变量,那么该变量一定是被final所修饰的"常量",或者是从未改变值的变量。

lambda表达式

lambda是一种对于函数的简写方式,它一般只包含函数的参数列表和方法体:(T o1, T o2) -> {方法体}

除了以上形式,在Java中lambda表达式还能被更一步简化,简化规则如下:

  • 参数只有一个时,可以省略参数的括号。
  • 可以省略参数类型:JVM会自动根据抽象方法中的参数,进行数据类型推导。
  • 方法体只有一条语句,return和大括号可以不写。

以下是一个lambda表达式的例子:

java 复制代码
Comsumer c = o -> System.out.println("Hello, World");
Function s = (Integer o) -> o.toString();

第一行中o是传入的参数,System.out.println("Hello, World");是函数体,这个抽象函数没有返回值。

第二行中o是传入的参数,返回一个String类型的o.toString()

lambda表达式的优点

  • 易于并行开发
  • 方便代码管理
  • 易于理解
  • 代码简洁

方法引用

方法引用指的是:使用现有类中的方法作为函数参数。

它的一般格式为:类名/实例::方法名。

方法引用又可以分为:静态方法引用,类名方法引用和实例方法引用。

静态方法引用

引用一个类中的静态方法。和另外两种方法引用不同,静态方法引用不需要类的实例作为参数,它是属于类本身的特性。

例如对Math类中的max()方法引用:Math::max

类名方法引用

使用类名进行方法引用需要一个类的实例作为类内方法的操作者。

实际上,类中除了静态方法的方法,隐藏了一个参数:实例对象。this指针其实表示的就是实例对象。

实例方法引用

由于已经有了一个实例,实例方法引用不需要外部额外传入一个新的实例作为参数。

为什么使用方法引用?

相比lambda表达式的灵活、定制化,方法引用显得有点呆板。这样的特征让方法引用在量化某种操作的时候显得格外高效。例如,要求排序全部使用降序,比起为每一个排序都书写一个lambda表达式,我们会更倾向于传入一个方法引用,这将大幅度降低我们的重复代码量。

匿名内部类

匿名内部类很少作为函数参数传入。究其原因在于其代码冗余,每次传入一个实例,并在其内部重写方法,从简洁性不如方法引用,从灵活性不如lambda表达式。

其书写格式为:

java 复制代码
new Predicate<String> {
	@Override
	public boolean test(String s) {
		return true;
	}
}

JDK中常见的函数式接口类

JDK为我们提供了许多函数式接口,其中比较常见的有:

  • Predicate:接受参数对象T, 返回一个布尔值。抽象函数为:test
  • Comsumer:接收参数T,不返回结果。抽象函数为:accept()
  • Function<T, R>:接受参数T,返回结果R。抽象函数为:apply()
  • Supplier:不接受参数,返回T。抽象函数为:get()
相关推荐
Tigshop开源商城4 小时前
『物流设置+SEO优化』Tigshop开源商城系统 JAVA v5.8.26 版本更新!
java·开源商城系统·tigshop
Purple Coder5 小时前
BMS学习经验
学习
Tigshop开源商城5 小时前
『订单税率+收货地址校验国家字段』功能上新|跨境运营更高效,Tigshop开源商城系统 JAVA v5.8.23 版本更新
java·开源商城系统·tigshop
REDcker6 小时前
C++变量存储与ELF段布局详解 从const全局到rodata与nm_readelf验证实践
java·c++·面试
经济元宇宙6 小时前
摄影培训行业百科:机构选择与学习路径全解析
大数据·人工智能·学习
じ☆冷颜〃6 小时前
实分析与测度论、复分析、傅里叶分析、泛函分析、凸分析概述.
笔记·学习·数学建模·拓扑学·傅立叶分析
星夜夏空997 小时前
STM32单片机学习(10)——GPIO输入
stm32·单片机·学习
kobesdu7 小时前
【ROS2实战笔记-19】ROS2 生命周期节点的启动顺序、状态转换陷阱与热备方案
java·前端·笔记·机器人·ros·ros2
neo_Ggx237 小时前
Maven 版本管理详解:SNAPSHOT、Release 与 Nexus 仓库的区别和影响
java·maven
matlabgoodboy7 小时前
软件开发定制小程序APP帮代做java代码代编写C语言设计python编程
java·c语言·小程序