11 Java 方法引用、异常处理

embedded/2024/9/23 21:36:06/

文章目录

  • 前言
  • 一、Java接口之函数式编程 --- 接口知识补充
    • 1 Function<T,R>泛型接口
    • 2 BiFunction<T, U, R>泛型接口
    • 3 自定义泛型函数式编程接口
  • 二、方法引用
    • 1 方法引用初体验(以Array.sort()方法为例)
    • 2 引用静态方法
    • 3 引用其他类成员方法


前言

一、Java接口之函数式编程 — 接口知识补充

前面在学习接口的时候很多都不知道,其中接口的有一项功能就是提供函数式编程的功能。为此Java还内置了两个专门的接口Function<T,R>和BiFunction<T, U, R>泛型接口。本节复习接口的使用和介绍这两个接口,已经到最终的自定义函数式接口(理解了这个接口就真的没有问题了)。

在前面学习stream流里面的map中间方法,里面用到了Function这个泛型接口,后来在学习方法引用,我发现这个接口结合方法引用使用有点有趣。虽然目前我很少看到有人这么干,但是我感觉很有意思,这里就来学习一下这个接口。

1 Function<T,R>泛型接口

很显然,这个函数式接口支持:

  • T 输入参数的类型。
  • R 是输出结果的类型。
    在这里插入图片描述
    源码里面这是一个函数式接口,在之前学习stream流里面的map中间方法也知道这个接口是用来定义映射关系的,简单来说就是函数关系。如果你用惯了python ,会发现java虽然说支持函数式编程,但也仅仅只是lambda表达式这种套着匿名对象类的假函数式编程。和python里面的def比较起来算个屁的函数式编程。

但是我发现Function这个接口有点 def 那个味道了,看下面例子。

java">/*
Function<Integer, Integer> square1 = new Function<Integer, Integer>() {@Overridepublic Integer apply(Integer x) {// 泛型中第一个参数:输入的 x 的 数据类型// 泛型中第二个参数:输出的 y 的 数据类型// x : 输入的数据// 返回值: 表示映射后的数据return x * x;}
};    // 实例化一个函数对象
int result1 = square1.apply(5);
System.out.println(result1);   // 25
*/// 使用lambda表达式的简洁定义函数对象方式
Function<Integer, Integer> square2 = x -> x * x;
int result = square2.apply(5);
System.out.println(result);   // 25

可以看到这样是不是十分接近python中的 def 了
这个接口只支持 单输入,下面的BiFunction<T, U, R>支持两个输入

2 BiFunction<T, U, R>泛型接口

很显然,这个函数式接口支持:

  • T 和 U 是输入参数的类型。
  • R 是输出结果的类型。
java">/*
BiFunction<Integer, Integer, Integer> add1 = new BiFunction<Integer, Integer, Integer>() {@Overridepublic Integer apply(Integer x, Integer y) {return x + y;}
};
int result1 = add1.apply(5, 3);
System.out.println(result1);  // 8
*/BiFunction<Integer, Integer, Integer> add2 = (x, y) -> x + y;
int result = add2.apply(5, 3);
System.out.println(result);  // 8

3 自定义泛型函数式编程接口

一般情况下,输入超过2个就要我们自己定义函数式接口了。

自定义接口

java">package cn.hjblogs.demo;@FunctionalInterface
interface TriFunction<T, U, V, R> {R apply(T t, U u, V v);
}
java">TriFunction<Integer,Integer,Integer,Integer> add = new TriFunction<Integer, Integer, Integer, Integer>() {@Overridepublic Integer apply(Integer x, Integer y, Integer z) {return x*y*z;}
};
int res = add.apply(2,3,5);
System.out.println(res);     // 30

二、方法引用

  • 方法:就是以前我们学习过的一些方法。
  • 引用:就是把已经有的方法拿过来用
    怎么用?当做函数式接口中抽象方法的方法体

1 方法引用初体验(以Array.sort()方法为例)

在这里插入图片描述
结合上面的图。我们来讲讲方法引用。
图中的Array.sort(数组,排序规则) 这个数组排序方法,关键在于排序规则这个参数是一个接口(准确的来说是一个函数式接口),意味着我们必须要传入这个接口的一个实现类。前面我们学过两种办法
(1)传入一个该接口的匿名内部类对象 (2)使用lambda表达式
本质上都是传进去一个该函数式接口的实现类对象。由于这是一个函数式接口,要我们重写的抽象方法只有一个,我们也可以理解为传入这个函数式接口的目的就是为了单单调用这个要求我们重写的抽象方法而已。
因此我们有了第三中传入方式
(3)方法引用:我们在上述的排序规则处,直接传入一个各种规则都和接口里面的要求重写的方法的形式一致的方法当做接口中抽象方法的方法体

【特别注意】:引用的方法是充当接口里面方法的方法体,简单来说就在抽象方法里面调用这个方法,不是充当抽象方法,是充当抽象方法的方法体的作用

【注】这个方法可以是java或者第三方写好的,也可以是我们自己写的。必须注意,方法格式必须和函数式接口里面的方法返回值、数据类型等等这些严格对应。

  • 被引用的方法必须已经存在
  • 被引用方法的形参和返回值需要跟抽象方法保持一致
  • 被引用方法的功能要满足当前需求

说白了,就是以前传匿名内部类、lambda表达式、现在方法引用就是传一个方法放进接口里面方法的方法体;其实底层还是在传接口的实现类。

下面演示一下就清楚了:

java">public class Test {public static void main(String[] args) {Integer[] arr = {3, 5, 4, 1, 6, 2};/*// 匿名内部类Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1 - o2;}});*//*// lambda表达式Arrays.sort(arr, (o1, o2) -> o1 - o2);*/// 方法引用// 把这个方法当做函数式接口抽象方法的方法体Arrays.sort(arr, Test::my_compare);   // 方法引用   类名::方法名System.out.println(Arrays.toString(arr)); // [1, 2, 3, 4, 5, 6]}// 自定义比较方法,要被方法引用的public static int my_compare(int num1, int num2){return num1 - num2;}}
  • :: 符号是方法引用符

2 引用静态方法

  • 格式: 类名::静态方法
  • 范例: Integer : :parseInt

3 引用其他类成员方法


http://www.ppmy.cn/embedded/104419.html

相关文章

Day 31: 贪心算法基础 V

56. 合并区间 本题也是重叠区间问题&#xff0c;如果昨天三道都吸收的话&#xff0c;本题就容易理解了。 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 示例 1: 输入: intervals [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,…

74. 搜索二维矩阵算法实现详解

LeetCode 74. 搜索二维矩阵详解 一、题目描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数 target,如果 target 在矩阵中,返回 true;否则,返回 false。 示例 1: …

C语言实现经典排序算法

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记…

【算法】LRU置换算法

运用你所掌握的数据结构&#xff0c;设计和实现一个 LRU (最近最少使用) 缓存机制 。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0…

压缩文件夹对比

分类 在Windows系统中&#xff0c;压缩文件夹可以使用多种格式&#xff0c;以下是一些常见的压缩格式及其区别&#xff1a; ZIP&#xff1a; ZIP是最常见的压缩格式之一&#xff0c;广泛支持于Windows和其他操作系统中。它可以用于压缩单个文件或整个文件夹。ZIP格式支持不同…

《机器学习》 DBSCAN算法 原理、参数解析、案例实现

目录 一、先看案例 1、对K-mean算法 1&#xff09;优点&#xff1a; 2&#xff09;缺点&#xff1a; 2、使用DBSCAN去分类 二、DBSCAN算法 1、什么是DBSCAN 2、实现过程 三、参数解析 1、用法 2、参数 1&#xff09;eps&#xff1a; 邻域的距离阈值 2&#xff09;mi…

电脑的一些配置(长期更新)

GPU驱动 主要是打游戏用到啦 上链接&#xff1a;Nvida驱动下载网址 关于电脑的一些显卡、驱动、更新等等都要做一些补充

机器学习之实战篇——预测二手房房价(线性回归)

机器学习之实战篇——预测二手房房价(线性回归&#xff09; 前言数据集和实验文件下载相关文章推荐实验过程导入相关模块数据预处理手动梯度下降训练使用scikit-learn随机梯度下降 前言 实验中难免有许多缺陷和错误&#xff0c;望批评指正&#xff01; 数据集和实验文件下载 …