深入理解 Java 8 函数式接口:定义、用法与示例详解

深入理解 Java 8 函数式接口:定义、用法与示例详解

Java 8 引入了函数式编程的概念,使代码更加简洁和可读。函数式接口是 Java 函数式编程的核心,它们是只包含一个抽象方法的接口。这种接口可以用于 Lambda 表达式和方法引用。本文将详细介绍 Java 8 的函数式接口,包括它们的定义、常用接口和使用示例。

1. 函数式接口的定义

函数式接口是只有一个抽象方法的接口,可以使用 @FunctionalInterface 注解进行标注,但这不是必须的。该注解的作用是为了保证该接口符合函数式接口的定义。

@FunctionalInterface
public interface MyFunctionalInterface {void execute();
}

虽然 @FunctionalInterface 注解不是必须的,但推荐使用它,因为它能使代码更具可读性,并在编译时提供额外的检查。

2. 常用的函数式接口

Java 8 提供了许多内置的函数式接口,这些接口都在 java.util.function 包中。以下是一些常用的函数式接口:

💣💥🔥Predicate:接收一个参数,返回一个布尔值。

@FunctionalInterface
public interface Predicate<T> {boolean test(T t);
}

💣💥🔥** Function<T, R>**:接收一个参数,返回一个结果。

@FunctionalInterface
public interface Function<T, R> {R apply(T t);
}

💣💥🔥Supplier:不接收参数,返回一个结果。

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

💣💥🔥Consumer:接收一个参数,没有返回值。

@FunctionalInterface
public interface Consumer<T> {void accept(T t);
}

💣💥🔥** UnaryOperator**:接收一个参数,返回与该参数类型相同的结果。

@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
}

💣💥🔥BinaryOperator:接收两个参数,返回与参数类型相同的结果。

@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T, T, T> {
}

3. 函数式接口的使用示例

函数式接口通常与 Lambda 表达式和方法引用一起使用。下面是一些使用示例:

💣 Predicate 示例

import java.util.function.Predicate;public class PredicateExample {public static void main(String[] args) {Predicate<String> isLongerThan5 = s -> s.length() > 5;System.out.println(isLongerThan5.test("hello")); // falseSystem.out.println(isLongerThan5.test("hello world")); // true}
}

💣Function 示例

import java.util.function.Function;public class FunctionExample {public static void main(String[] args) {Function<String, Integer> stringLength = s -> s.length();System.out.println(stringLength.apply("hello")); // 5}
}

💣Supplier 示例

import java.util.function.Supplier;public class SupplierExample {public static void main(String[] args) {Supplier<String> stringSupplier = () -> "Hello, World!";System.out.println(stringSupplier.get()); // Hello, World!}
}

💣Consumer 示例

import java.util.function.Consumer;public class ConsumerExample {public static void main(String[] args) {Consumer<String> printConsumer = s -> System.out.println(s);printConsumer.accept("Hello, World!"); // Hello, World!}
}

💣UnaryOperator 示例

import java.util.function.UnaryOperator;public class UnaryOperatorExample {public static void main(String[] args) {UnaryOperator<Integer> square = x -> x * x;System.out.println(square.apply(5)); // 25}
}

💣BinaryOperator 示例

import java.util.function.BinaryOperator;public class BinaryOperatorExample {public static void main(String[] args) {BinaryOperator<Integer> add = (a, b) -> a + b;System.out.println(add.apply(5, 3)); // 8}
}

4. 自定义函数式接口

除了使用 Java 提供的函数式接口外,你还可以定义自己的函数式接口。下面是一个自定义函数式接口的示例:

@FunctionalInterface
public interface MyFunctionalInterface {void execute(String message);
}public class FunctionalInterfaceDemo {public static void main(String[] args) {MyFunctionalInterface myFunc = (message) -> System.out.println(message);myFunc.execute("Hello, Functional Interface!"); // Hello, Functional Interface!}
}

5. 使用方法引用

方法引用是另一种简洁的 Lambda 表达式写法。常见的用法包括引用静态方法、实例方法和构造方法。

💥静态方法引用

import java.util.function.Function;public class MethodReferenceExample {public static void main(String[] args) {Function<String, Integer> stringToInt = Integer::parseInt;System.out.println(stringToInt.apply("123")); // 123}
}

💥实例方法引用

import java.util.function.Predicate;public class InstanceMethodReferenceExample {public static void main(String[] args) {String str = "Hello";Predicate<String> isEqual = str::equals;System.out.println(isEqual.test("Hello")); // trueSystem.out.println(isEqual.test("World")); // false}
}

💥构造方法引用

import java.util.function.Supplier;
import java.util.ArrayList;
import java.util.List;public class ConstructorReferenceExample {public static void main(String[] args) {Supplier<List<String>> listSupplier = ArrayList::new;List<String> list = listSupplier.get();System.out.println(list); // []}
}

通过掌握 Java 8 的函数式接口及其用法,可以编写出更加简洁和高效的代码,充分利用函数式编程的优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.2 休息日 背包问题总结

就目前所遇到的01背包与完全背包作总结。 01背包 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 二维dp数组01背包 动规五部曲 1.确定…

IO流(2)

缓冲流 字节缓冲流 利用字节缓冲区拷贝文件&#xff0c;一次读取一个字节&#xff1a; public class test {public static void main(String [] args) throws IOException {//利用字节缓冲区来拷贝文件BufferedInputStream bisnew BufferedInputStream(new FileInputStream(&…

STM32作业实现(四)光敏传感器

目录 STM32作业设计 STM32作业实现(一)串口通信 STM32作业实现(二)串口控制led STM32作业实现(三)串口控制有源蜂鸣器 STM32作业实现(四)光敏传感器 STM32作业实现(五)温湿度传感器dht11 STM32作业实现(六)闪存保存数据 STM32作业实现(七)OLED显示数据 STM32作业实现(八)触摸按…

Java网络编程(上)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java文件IO&#x1f649; &#x1f439;今日诗词:来如春梦几多时&#xff1f;去似朝云无觅处&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&a…

【Qt知识】disconnect

在Qt框架中&#xff0c;disconnect函数用于断开信号与槽之间的连接。当不再需要某个信号触发特定槽函数时&#xff0c;或者为了防止内存泄漏和重复执行问题&#xff0c;你可以使用disconnect来取消这种关联。disconnect函数的基本用法可以根据不同的需求采用多种形式&#xff0…

C++对C的增强

1、作用域运算符 ::解决归属问题&#xff08;谁是谁的谁&#xff09; 可以优先使用全局变量 2、命名空间 使用关键字namespace&#xff0c;控制标名称的作用域。 命名空间的本质&#xff1a;对符号常量、变量、函数、结构、枚举、类和对象等等进行封装 1、创建一个命名空间…

Go 语言中的指针

在许多现代编程语言中&#xff0c;如 Java 和 .NET&#xff0c;程序员通常无法直接控制底层的内存管理。然而&#xff0c;Go 语言提供了这样的能力&#xff0c;同时限制了可能导致错误的操作&#xff0c;比如指针运算。 文章目录 1、Go 语言中指针的介绍1.1、什么是指针&#x…

图解DSPy:Prompt的时代终结者?!

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调重新阅读。而最新科技&#xff08;Mamba&#xff0c;xLSTM,KAN&#xff09;则提供了大模…

时序动作定位 | PivoTAL:弱监督时间动作定位的先验驱动监督(CVPR 2023)

<PivoTAL: Prior-Driven Supervision for Weakly-Supervised Temporal Action Localization> 论文:PivoTAL: Prior-Driven Supervision for Weakly-Supervised Temporal Action Localization (thecvf.com) 创新点: 定位驱动的监督框架:定位视角:文章提出的PivoTAL方法…

chap6 RNN

循环神经网络&#xff08;RNN&#xff09; 问题描述&#xff1a; 利用循环神经网络&#xff0c;实现唐诗生成任务 数据集&#xff1a; 唐诗 题目要求&#xff1a; 补全程序&#xff0c;主要是前面的3个空和生成诗歌的一段代码&#xff0c;pytorch需要补全对应的rnn.py文件…

多元联合分布建模 Copula python实例

多元联合分布建模 Copula python实例 目录 库安装 实例可视化代码 库安装 pip install copulas 实例可视化代码 import numpy as np import pandas as pd from copulas.multivariate import GaussianMultivariate# Generate some example data np.random.seed(42) data = …

ChatTTS:开源最强文本转真人语音工具

目录 1.前言 2.详细介绍 2.1 什么是ChatTTS 2.2 项目地址: 2.3 应用特点: 3.如何安装和使用 3.1.谷歌colab 3.1.1.点击链接 3.1.2 进行保存 3.1.3 按照流程依次点击运行 3.1.4 填写自己需要转的文字 3.2 本地运行 3.2.1 下载或克隆项目源码到本地 3.2.2 …

算法每日一题(python,2024.05.31)

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 二次遍历&#xff0c;第一次遍历用哈希表记录每个字母的出现次数&#xff0c;出现一次则将它的value值赋为True&#xff0c;将它的下标赋为key值&#x…

HTTPS加密

一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…

基于Springboot开发的外卖餐购项目(后台管理+消费者端)

免费获取方式↓↓↓ 项目介绍039&#xff1a; 系统运行 后端登录页: http://localhost:8081/backend/page/login/login.html 消费端请求:消费端主页: http://localhost:8081/front/index.html 管理员账号 admin 123456 消费者不需要登录 采用技术栈 前端&#xff1a;Eleme…

力扣20 有效的括号

给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括…

8月编程语言排行榜:揭秘热门语言背后的力量与魅力

8月编程语言排行榜&#xff1a;揭秘热门语言背后的力量与魅力 随着技术的不断进步和创新&#xff0c;编程语言的世界也在不断变化和演进。每年的8月&#xff0c;全球知名编程社区TIOBE都会公布最新的编程语言排行榜&#xff0c;为我们揭示了哪些语言正在引领着技术的潮流。在这…

【智能算法】红嘴蓝喜鹊优化算法(RBMO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;S Fu受到自然界中红嘴蓝喜鹊社会行为启发&#xff0c;提出了红嘴蓝喜鹊优化算法&#xff08;Red-billed Blue Magpie Optimizer, RBMO&#xff09;。 2.算法原理 2.1算…

MicroBlaze 处理器参考指南

概述 本章包含MicroBlaze功能的概述和详细信息MicroBlaze架构包括Big-Endian或Little-Endian位反转格式&#xff0c;32位或64位通用寄存器&#xff0c;虚拟内存管理&#xff0c;缓存软件支持&#xff0c;和AXI4-Stream接口 简介 MicroBlaze嵌入式处理器软核是一个精简指令集…

[JS] 前端充分使用console.log()有效输出(2024-6-1)

将变量包装在对象中 不要使用 console.log(url, url2, baz)&#xff0c;而是使用 console.log({ url, url2, baz })。 如果你比较这两者&#xff0c;你会发现这有多么有用&#xff1a;拥有 url 和 url2 键可以避免这两个 URL 之间的混淆。 在日志前加上唯一字符串前缀 在应用…