当前位置: 首页 > news >正文

Java8函数式接口全攻略

一、接口大白话

1.四大基础接口

  • Consumer<T>
    • 核心方法:void accept(T t);
    • 消费者。接受一个输入参数,不返回任何结果的操作。
    • 望文生义:你给我啥,我就执行啥,没有结果。
  • Supplier<T>
    • 核心方法: T get();
    • 供应商。生成一个指定类型的对象,方法没有参数。
    • 望文生义:我也不跟你要,我有啥就给你啥。
  • Function<T, R>
    • 核心方法:R apply(T t);
    • 函数。接受一个输入参数,返回一个结果。
    • 望文生义:你想要什么,你就得把原料和加工方法告诉我。
  • Predicate<T>
    • 核心方法:boolean test(T t);
    • 断言。接受一个输入参数,返回一个布尔值结果。
    • 望文生义:是对是错总有一个,事儿你告诉我,我负责出结果。

2. 子接口和派生接口

2.1 Consumer

派生接口:
  • BiConsumer<T, U>
    • 接口说明:接受两个输入参数并且没有返回结果的操作。
    • 核心方法:void accept(T t, U u);

2.2 Function

子接口:
  • UnaryOperator<T>
    • 接口说明:接受两个输入参数并且没有返回结果的操作。
    • 核心方法:void accept(T t, U u);
派生接口:
  • IntFunction<R>
    • 接口说明:接受一个 int 类型的输入参数,并返回一个指定类型的结果。
    • 核心方法:R apply(int value)。
  • IntUnaryOperator
    • 接口说明:接受一个 int 类型的参数并且返回同一类型的结果。
    • 核心方法:int applyAsInt(int operand)。
  • ToDoubleFunction<T>
    • 接口说明:接受一个输入参数,并返回一个 double 类型的结果。
    • 核心方法:double applyAsDouble(T value)。
  • ToLongFunction<T>
    • 接口说明:接受一个输入参数,并返回一个 long 类型的结果。
    • 核心方法: long applyAsLong(T value)。
  • ToIntFunction<T>
    • 接口说明:接受一个输入参数,并返回一个 int 类型的结果。
    • 核心方法:int applyAsInt(T value)。
  • BiFunction<T, U, R>
    • 接口说明:接受两个输入参数并且返回结果。
    • 核心方法:R apply(T t, U u)。
    • 子接口BinaryOperator<T>
      • 接口说明:接受两个同类型的参数并且返回同一类型的结果。
      • 核心方法:T apply(T t1, T t2)。
    • 派生接口IntBinaryOperator
      • 接口说明:接受两个同类型的 int 类型参数并且返回同一类型的结果。
      • 核心方法:int applyAsInt(int left, int right)。

2.3 Predicate

派生接口:
  • IntPredicate
    • 接口说明:接受一个 int 类型的参数,返回一个布尔值结果。
    • 核心方法: boolean test(int value)。

二、基础接口源码:

1. Consumer

/** 该代码定义了一个函数式接口 Consumer,它表示一个接受单个输入参数并且不返回结果的操作。* Consumer 接口的主要方法是 accept,允许执行具有副作用的操作。* 此外,接口还提供了 andThen 方法,用于将两个 Consumer 操作串联在一起,使得在执行第一个操作后可以执行第二个操作。* 如果在执行任何操作时抛出异常,异常将被传递给调用者。* * @param <T> 输入操作的类型*/
package java.util.function;
import java.util.Objects;@FunctionalInterface
public interface Consumer<T> {void accept(T t);default Consumer<T> andThen(Consumer<? super T> after) {Objects.requireNonNull(after);return (T t) -> { accept(t); after.accept(t); };}
}

2. Supplier

package java.util.function;/** 该代码定义了一个函数式接口 Supplier,表示结果的供应者。* 该接口包含一个方法 get(),用于获取结果。Supplier 接口的实现可以返回一个类型为 T 的结果。* 该接口没有要求每次调用时返回新的或不同的结果。它是 Java 1.8 引入的。*/
@FunctionalInterface
public interface Supplier<T> {T get();
}

3. Predicate

/** 该代码定义了一个函数式接口 Predicate,表示一个接受一个参数并返回布尔值的函数。* 该接口包含一个测试方法 test(T t),以及用于组合多个谓词的默认方法 and、negate 和 or。* 还提供了一个静态方法 isEqual,用于创建一个谓词,该谓词测试两个参数是否相等。* 该接口是 Java 8 引入的,位于 java.util.function 包中。*/
package java.util.function;import java.util.Objects;/*** 表示一个一元谓词(布尔值函数)。** <p>这是一个功能接口,其功能方法是{@link #test(Object)}。** @param <T> 谓词的输入类型** @since 1.8*/
@FunctionalInterface
public interface Predicate<T> {/*** 使用给定的参数评估此谓词。** @param t 输入参数* @return 如果输入参数符合谓词条件,则返回{@code true},否则返回{@code false}*/boolean test(T t);/*** 返回一个组合谓词,代表此谓词和另一个谓词的短路逻辑与。* 当评估组合谓词时,如果此谓词为{@code false},则不会评估{@code other}谓词。** <p>评估任一谓词时抛出的任何异常都会被传递给调用者;* 如果评估此谓词时抛出异常,则不会评估{@code other}谓词。** @param other 将与此谓词进行逻辑与的谓词* @return 一个组合谓词,代表此谓词和{@code other}谓词的短路逻辑与* @throws NullPointerException 如果other为null*/default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}/*** 返回一个谓词,表示此谓词的逻辑非。** @return 表示此谓词逻辑非的谓词*/default Predicate<T> negate() {return (t) -> !test(t);}/*** 返回一个组合谓词,代表此谓词和另一个谓词的短路逻辑或。* 当评估组合谓词时,如果此谓词为{@code true},则不会评估{@code other}谓词。** <p>评估任一谓词时抛出的任何异常都会被传递给调用者;* 如果评估此谓词时抛出异常,则不会评估{@code other}谓词。** @param other 将与此谓词进行逻辑或的谓词* @return 一个组合谓词,代表此谓词和{@code other}谓词的短路逻辑或* @throws NullPointerException 如果other为null*/default Predicate<T> or(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) || other.test(t);}/*** 返回一个谓词,测试两个参数是否根据{@link Objects#equals(Object, Object)}相等。** @param <T> 谓词的参数类型* @param targetRef 用于比较相等的对象引用,可以为{@code null}* @return 一个谓词,测试两个参数是否根据{@link Objects#equals(Object, Object)}相等*/static <T> Predicate<T> isEqual(Object targetRef) {return (null == targetRef)? Objects::isNull: object -> targetRef.equals(object);}
}

4. Function

/** 此代码定义了一个函数式接口 Function,表示接受一个参数并产生一个结果的函数。* 该接口包含一个抽象方法 apply,允许实现类定义函数的具体行为。* 还提供了 compose 和 andThen 方法,用于函数的组合,允许在函数调用前后应用其他函数。* 此外,提供了一个静态方法 identity,返回一个始终返回其输入参数的函数。* 该接口是 Java 8 引入的,属于 java.util.function 包。*/
package java.util.function;import java.util.Objects;/*** 代表接受一个参数并生成结果的函数。** 该接口是一个函数式接口,其函数方法是{@link #apply(Object)}。** @param <T> 函数输入的类型* @param <R> 函数结果的类型** @since 1.8*/
@FunctionalInterface
public interface Function<T, R> {/*** 将此函数应用于给定参数。** @param t 函数参数* @return 函数结果*/R apply(T t);/*** 返回一个复合函数,首先将输入应用于{@code before}函数,然后将此函数应用于结果。* 如果任一函数的评估抛出异常,它将被传递给复合函数的调用者。** @param <V> {@code before}函数和复合函数的输入类型* @param before 在应用此函数之前应用的函数* @return 一个复合函数,首先应用{@code before}函数,然后应用此函数* @throws NullPointerException 如果before为null** @see #andThen(Function)*/default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {Objects.requireNonNull(before);return (V v) -> apply(before.apply(v));}/*** 返回一个复合函数,首先将此函数应用于输入,然后将结果应用于{@code after}函数。* 如果任一函数的评估抛出异常,它将被传递给复合函数的调用者。** @param <V> {@code after}函数和复合函数的输出类型* @param after 在应用此函数之后应用的函数* @return 一个复合函数,首先应用此函数,然后应用{@code after}函数* @throws NullPointerException 如果after为null** @see #compose(Function)*/default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {Objects.requireNonNull(after);return (T t) -> after.apply(apply(t));}/*** 返回一个总是返回其输入参数的函数。** @param <T> 函数的输入和输出对象的类型* @return 一个总是返回其输入参数的函数*/static <T> Function<T, T> identity() {return t -> t;}
}

相关文章:

Java8函数式接口全攻略

一、接口大白话 1.四大基础接口 Consumer<T> 核心方法&#xff1a;void accept(T t);消费者。接受一个输入参数&#xff0c;不返回任何结果的操作。望文生义&#xff1a;你给我啥&#xff0c;我就执行啥&#xff0c;没有结果。 Supplier<T> 核心方法: T get();供…...

英文软件汉化中文软件教程asi exe dll 等汉化教程

相信大家在使用国际软件的时候&#xff0c;会经常碰到英文类型的软件 或者玩一些游戏使用一些工具&#xff0c;也基本都是外网的&#xff0c;那么对于用户来讲 就会非常的不方便&#xff01; 小编为大家整理了一些国内大佬出的的英文软件汉化中文软件的视频教程 教程分为EX…...

HTTP 请求方式`application/x-www-form-urlencoded` 与 `application/json` 怎么用?有什么区别?

HTTP 请求方式总结&#xff1a;application/x-www-form-urlencoded 与 application/json 在前后端交互中&#xff0c;客户端发送数据到服务器的常见方式有两种&#xff1a;application/x-www-form-urlencoded 和 application/json。本文将详细介绍这两种请求方式的特点、使用方…...

prometheus 集成 grafana 保姆级别安装部署

前言 本文 grafana 展示效果只需要 prometheus node_exporter grafana 其他的选择安装 环境和版本号 系统: CentOS 7.9 prometheus: 2.54.1 pushgateway: 1.9.0 node_exporter: 1.8.2 alertmanager: 0.27.0 grafana:11.2.0 官网:https://prometheus.io/ 下载地址:h…...

Apache SeaTunnel Committer 进阶指南

Apache SeaTunnel 作为一个开源的数据集成工具&#xff0c;旨在简化和加速海量数据的采集和传输。 社区的 Committer 是指拥有项目存储库的写权限的社区成员&#xff0c;即 Committer 可以自行修改代码、文档和网站&#xff0c;也可以合并其他成员的贡献。成为 Apache SeaTunn…...

组件上的v-model(数据传递),props验证,自定义事件,计算属性

一.props验证 在封装组件时对外界传递过来的props数据进行合法性校验&#xff0c;从而防止数据不合法问题。 1.基础类型检查 String,Number,Boolean,Array,Object,Date,Function,Symbol 2.多个可能的类型 3.必须项校验 4.属性默认值 5.自定义验证函数 <template>&…...

mfc140u.dll文件错误的相关修复方法,4种方法修复mfc140u.dll

当面对基于Microsoft Visual C开发的应用程序出现启动或运行失败时&#xff0c;mfc140u.dll文件错误往往是罪魁祸首之一。这个动态链接库&#xff08;DLL&#xff09;文件对于许多Windows软件来说是必不可少的&#xff0c;因为它包含了重要的编程代码和数据。如果发现此文件损坏…...

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存中没有命中&#xff0c;会去数据库中查询&#xff0c;而数据库中也没有该数据&#xff0c;并且每次查询都不会命中缓存&#xff0c;从而每次请求都直接打到了数据库上&#xff0c;这会给数据…...

css百分比布局中height:100%不起作用

百分比布局时&#xff0c;我们有时候会遇到给高度 height 设置百分比后无效的情况&#xff0c;而宽度设置百分比却是正常的。 当为一个元素的高度设定为百分比高度时&#xff0c;是相对于父元素的高度来计算的。当没有给父元素设置高度&#xff08;height&#xff09;时或设置…...

java程序员入行科目一之CRUD轻松入门教程(二)

封装工具类 封装获取连接&释放资源操作 在实际使用JDBC的时候&#xff0c;很多操作都是固定的&#xff0c;没有必要每次都去注册驱动&#xff0c;获取链接对象等等。 同样&#xff0c;释放资源的close操作也可以封装一下 下面是封装好的具体工具类 package com.jimihua.u…...

(不用互三)解密AI创作:提升Prompt提示词的提问技巧

文章目录 &#x1f34a;AI创作的核心&#xff1a;提示词 Prompt 的重要性1. 什么是提示词工程&#xff1f;1.1 提示词的工作原理1.2 高薪提示词工程师的现实1.3 谁能胜任提示词工程师&#xff1f; 2. 提示词编写技巧3. 常见的提示词框架3.1 CO-STAR 框架3.2 BORKE 框架 4. 提示…...

Python 错误 ValueError 解析,实际错误实例详解 (二)

文章目录 前言Python 中错误 ValueError: Not Enough Values to UnpackPython 中的 ValueError 是什么修复Python字典中 ValueError:ValueError: not enough values to unpack修复Python中 ValueError:not enough values to unpackPython 中错误 ValueError: Setting an Arra…...

会员计次卡渲染技术-—SAAS本地化及未来之窗行业应用跨平台架构

一、计次卡应用 1. 健身中心&#xff1a;会员购买一定次数的健身课程或使用健身房设施的权限。 2. 美容美发店&#xff1a;提供一定次数的理发、美容护理等服务。 3. 洗车店&#xff1a;车主购买若干次的洗车服务。 4. 儿童游乐场&#xff1a;家长为孩子购买固定次数的入场游…...

Redis网络模型、通信协议、内存回收

Redis网络模型 一、用户空间和内核空间&#xff08;前提&#xff09;问题来了&#xff1a;为啥要区分用户空间和内核空间呢&#xff1f;我们来看看两个空间以及硬件是如何操作的 二、Linux中五种IO模型1、 阻塞IO2、非阻塞IO3、IO多路复用3.1、SELECT3.2、poll3.3、epoll 4、信…...

闯关leetcode——21. Merge Two Sorted Lists

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/merge-two-sorted-lists/description/ 内容 You are given the heads of two sorted linked lists list1 and list2. Merge the two lists into one sorted list. The list should be made by sp…...

Notepad++中提升编码效率的关键快捷键

基本操作 Ctrl N&#xff1a;新建文件。Ctrl O&#xff1a;打开文件。Ctrl S&#xff1a;保存文件。Ctrl Shift S&#xff1a;另存为。Ctrl W&#xff1a;关闭当前文件。 文件和标签管理 Ctrl Tab&#xff1a;切换到下一个标签。Ctrl Shift Tab&#xff1a;切换到上…...

ai智能语电销机器人有哪些功能?

近几年火爆的AI语音机器人&#xff0c;已经可以成熟的服务于金融贷款、理财、房地产、电商、汽车等行业&#xff0c;成熟的适用于电话销售、客服服务、售后管理等等基础岗位&#xff0c;那么ai智能语电销机器人有哪些功能&#xff1f;我们来看一看。 顾名思义&#xff0c;智能…...

ctfshow-PHP反序列化

web254 源码 <?php/* # -*- coding: utf-8 -*- # Author: h1xa # Date: 2020-12-02 17:44:47 # Last Modified by: h1xa # Last Modified time: 2020-12-02 19:29:02 # email: h1xactfer.com # link: https://ctfer.com //mytime 2023-12-4 0:22 */ error_reporting(0)…...

BEV学习---LSS-2

前言一、相关参数设置二、LSS算法前向过程 1.整体步骤2.创建视锥3.坐标变换4.视锥点云特征5.VoxelPooling 5.1 cumsum_trick(池化累积求和技巧):5.2 VoxelPooling总结 前言 目前在自动驾驶领域&#xff0c;比较火的一类研究方向是基于采集到的环视图像信息去构建BEV视角下的特征…...

PhpStudy下载安装使用学习

一、官网下载 官网地址&#xff1a;Windows版phpstudy下载 - 小皮面板(phpstudy)https://old.xp.cn/download.html 【首页】选择Windows版&#xff0c;进行下载 下载完成是一个压缩包的形式&#xff0c;解压得到一个.exe的执行文件&#xff0c;点击执行安装程序&#xff08;注…...

YOLOv8工业缺陷检测推理延迟骤降63%:基于TensorRT量化+ONNX Runtime定制化内核的完整链路

第一章&#xff1a;YOLOv8工业缺陷检测推理延迟骤降63%&#xff1a;基于TensorRT量化ONNX Runtime定制化内核的完整链路在高吞吐产线场景下&#xff0c;YOLOv8原生PyTorch模型在Jetson AGX Orin上单帧推理延迟达84.2ms&#xff08;输入尺寸640640&#xff09;&#xff0c;严重制…...

用 OpenAI Codex 打造你的 AI 结对编程助手

用 OpenAI Codex 打造你的 AI 结对编程助手 告别重复劳动&#xff0c;让 AI 直接帮你写代码、修 Bug、跑测试 在 AI 编程工具层出不穷的今天&#xff0c;OpenAI Codex 依然是许多开发者心目中的“神器”。与普通的代码补全工具不同&#xff0c;Codex 是一款终端原生的 AI 编程助…...

2026降AI率工具红黑榜:降AI率网站怎么选?看完少走弯路

千笔AI、ThouPen、豆包位列红榜&#xff0c;精准适配国内高校AI率检测规范&#xff1b;黑榜需避开低质免费工具、无正规检测对接平台及改写痕迹明显的工具&#xff1b;选择时应优先匹配三维模型&#xff1a;降AI效果-学术合规性-使用成本。 一、红榜&#xff1a;10 款高分论文降…...

Vial-QMK键盘固件从入门到精通:打造专属机械键盘体验

Vial-QMK键盘固件从入门到精通&#xff1a;打造专属机械键盘体验 【免费下载链接】vial-qmk QMK fork with Vial-specific features. 项目地址: https://gitcode.com/gh_mirrors/vi/vial-qmk Vial-QMK是一款功能强大的开源键盘固件&#xff0c;为机械键盘爱好者提供了全…...

紧急通知:2024年Q3起欧盟EDPS已将差分隐私实现纳入DPIA强制审查项——Python开发者必须立即核查的4个代码检查点

第一章&#xff1a;差分隐私合规性背景与EDPS新规解读随着欧盟数据保护监管体系持续演进&#xff0c;欧洲数据保护监督机构&#xff08;EDPS&#xff09;于2024年7月发布《关于匿名化与假名化技术在公共部门应用的指导意见》&#xff0c;首次将差分隐私&#xff08;Differentia…...

SOONet与Transformer架构深度解析:提升长视频理解精度的核心技术

SOONet与Transformer架构深度解析&#xff1a;提升长视频理解精度的核心技术 最近在折腾长视频内容理解的项目时&#xff0c;遇到了一个挺头疼的问题&#xff1a;用户给一段长达几分钟甚至几十分钟的视频&#xff0c;再提一个复杂的自然语言问题&#xff0c;比如“请找出视频中…...

【AI工程化硬核考点】:FastAPI 2.0 + async/await + StreamingResponse三重协程调度机制精讲

第一章&#xff1a;FastAPI 2.0 异步 AI 流式响应 面试题汇总FastAPI 2.0 原生强化了对异步流式响应&#xff08;StreamingResponse&#xff09;的支持&#xff0c;尤其适用于大语言模型&#xff08;LLM&#xff09;推理、实时日志推送、AI 生成内容分块返回等场景。面试官常聚…...

5分钟搞定OpenClaw+nanobot:超轻量级AI助手一键部署指南

5分钟搞定OpenClawnanobot&#xff1a;超轻量级AI助手一键部署指南 1. 为什么选择OpenClawnanobot组合 上周我在整理电脑上的项目文档时&#xff0c;突然意识到自己每天要重复执行大量机械操作&#xff1a;查找文件、转换格式、汇总数据。作为独立开发者&#xff0c;这些琐事…...

MoveBase导航实战:Livox MID360与FAST-LIO+AMCL混合定位的调优与避障策略

1. Livox MID360雷达与FAST-LIO的实战配置 第一次用Livox MID360雷达时&#xff0c;我被它的非重复扫描模式惊艳到了——这种固态激光雷达能实现360无死角覆盖&#xff0c;特别适合狭小空间导航。但要让它在MoveBase系统中稳定工作&#xff0c;需要先解决几个关键配置问题。 雷…...

3分钟掌握Umi-OCR插件:打造你的专属文字识别工具箱

3分钟掌握Umi-OCR插件&#xff1a;打造你的专属文字识别工具箱 【免费下载链接】Umi-OCR_plugins Umi-OCR 插件库 项目地址: https://gitcode.com/gh_mirrors/um/Umi-OCR_plugins 还在为不同场景下的文字识别需求而烦恼吗&#xff1f;Umi-OCR插件库为你提供了完美的解决…...