,从而确定相机相对于D点的位姿。 基本概念 旋转矩阵(R):描述相机的姿态,×维度,用于表示D世界坐标系到相机坐标系的旋转关系 平移 ...
吃技厦步一、函数式接口的定义函数式接口 Functional Interface 是Java 8引入的核心概念它是指有且仅有一个抽象方法的接口可包含默认方法和静态方法。这种接口可以用Lambda表达式或方法引用来实现是函数式编程在Java中的基础。// 标准定义FunctionalInterface // 编译期检查可选但推荐public interface MyFunction {String apply(int x); // 唯一的抽象方法// 允许默认方法default void print(String msg) {System.out.println(msg);}// 允许静态方法static void log(String msg) {System.out.println([LOG] msg);}}二、渐进式学习——代码示例2.1 阶段1从匿名类到Lambda演化public class EvolutionDemo {public static void main(String[] args) {List names Arrays.asList(Alice, Bob, Charlie);// 【传统方式】匿名内部类names.forEach(new Consumer() {Overridepublic void accept(String name) {System.out.println(name);}});// 【方式1】Lambda完整语法names.forEach((String name) - {System.out.println(name);});// 【方式2】Lambda简化参数类型推导names.forEach((name) - System.out.println(name));// 【方式3】Lambda最简单参数可省括号names.forEach(name - System.out.println(name));// 【方式4】方法引用终极简化names.forEach(System.out::println);}}2.2 阶段2Java内置的四大核心函数式接口精讲1. Consumer - 消费型接口FunctionalInterfacepublic interface Consumer {void accept(T t);}作用接收一个参数不返回结果示例// 打印字符串Consumer printer s - System.out.println(s);printer.accept(Hello, Consumer!);// 消费列表元素List names Arrays.asList(Alice, Bob, Charlie);names.forEach(name - System.out.println(Hello, name));2. Supplier- 供给型接口FunctionalInterfacepublic interface Supplier {T get();}作用不接收参数返回一个结果示例// 生成随机数Supplier randomSupplier () - Math.random();System.out.println(Random: randomSupplier.get());// 延迟初始化Supplier lazyString () - {System.out.println(Initializing...);return Lazy Value;};System.out.println(Before get);System.out.println(lazyString.get());3. Function - 函数型接口FunctionalInterfacepublic interface Function {R apply(T t);}作用接收一个参数返回一个结果示例// 字符串转整数Function stringToInt s - Integer.parseInt(s);int result stringToInt.apply(123);System.out.println(Result: result);// 函数组合Function doubleIt x - x * 2;Function addOne x - x 1;Function composed doubleIt.andThen(addOne);System.out.println(Composed: composed.apply(5)); // 输出: 114. Predicate - 断言型接口FunctionalInterfacepublic interface Predicate {boolean test(T t);}作用接收一个参数返回布尔值示例// 判断字符串是否为空Predicate isEmpty s - s null || s.isEmpty();System.out.println(Is empty: isEmpty.test()); // true// 过滤列表List numbers Arrays.asList(1, 2, 3, 4, 5, 6);List evenNumbers numbers.stream().filter(n - n % 2 0).collect(Collectors.toList());System.out.println(Even numbers: evenNumbers); // [2, 4, 6]2.3 阶段3自定义函数式接口实践// 定义业务相关的函数式接口FunctionalInterfaceinterface OrderValidator {boolean validate(Order order);// 默认方法组合验证default OrderValidator and(OrderValidator other) {return order - this.validate(order) other.validate(order);}}// 使用自定义接口public class CustomFunctionalInterface {public static void main(String[] args) {List orders createOrders();// 定义验证规则OrderValidator isActive Order::isActive;OrderValidator isHighValue o - o.getAmount() 1000;// 组合验证利用默认方法OrderValidator combined isActive.and(isHighValue);// 应用验证orders.stream().filter(combined::validate) // 方法引用.forEach(o - System.out.println(Valid: o));}}2.4 阶段4方法引用与构造函数引用public class ReferenceDemo {public static void main(String[] args) {List names Arrays.asList(Tom, Jerry);// 1. 静态方法引用类名::静态方法names.stream().map(String::toUpperCase) // 等价于 s - s.toUpperCase().forEach(System.out::println);// 2. 实例方法引用对象::实例方法String prefix Name: ;names.forEach(s - System.out.println(prefix s));// 3. 构造函数引用类名::newSupplier listSupplier ArrayList::new;List newList listSupplier.get();// 4. 数组构造函数引用类型[]::newIntFunction arrayCreator String[]::new;String[] array arrayCreator.apply(5); // 创建长度为5的数组}}2.5 阶段5Stream API中的函数式接口应用public class StreamFunctionalDemo {public static void main(String[] args) {List employees Arrays.asList(new Employee(Alice, 8000, Tech),new Employee(Bob, 12000, Tech),new Employee(Charlie, 7000, HR));// 综合案例分组、过滤、转换Map result employees.stream().filter(e - e.getSalary() 7500) // Predicate.map(Employee::getName) // Function.collect(Collectors.groupingBy(name - name.substring(0, 1) // Function));System.out.println(result); // {A[Alice], B[Bob]}}}2.6 综合实战案例// 构建一个函数式风格的订单处理系统public class OrderProcessor {// 核心用函数式接口定义可组合的业务规则private final Function taxCalculator;private final Predicate validationRule;private final Consumer auditLogger;// 构造函数注入行为public OrderProcessor(Function taxCalculator,Predicate validationRule,Consumer auditLogger) {this.taxCalculator taxCalculator;this.validationRule validationRule;this.auditLogger auditLogger;}public void process(List orders) {orders.stream().filter(validationRule) // 验证.peek(auditLogger) // 记录日志.map(order - { // 计算税后价格double tax taxCalculator.apply(order);order.setFinalPrice(order.getAmount() tax);return order;}).forEach(order - System.out.println(处理完成: order));}public static void main(String[] args) {// 配置不同的业务规则OrderProcessor domesticProcessor new OrderProcessor(order - order.getAmount() * 0.1, // 10%税Order::isActive, // 仅处理激活订单o - System.out.println(审计: o.getId()));domesticProcessor.process(createOrders());}}三、总结在四大核心函数式函数式接口的基础上还有BiFunction - 双参数转换、UnaryOperator - 一元操作、BinaryOperator - 二元操作。简单来说UnaryOperator和BinaryOperator并非新的概念而是两大核心函数式接口的“特化”或“简化版”。它们与四大核心函数接口的关系是包含与被包含的关系而非并列关系。接口类型 方法签名 用途 示例Consumer void accept(T t) 消费数据 forEachSupplier T get() 提供数据 延迟初始化Function R apply(T t) 数据转换 mapPredicate boolean test(T t) 条件判断 filterBiFunction R apply(T t, U u) 双参数转换 合并操作UnaryOperator T apply(T t) 一元操作 字符串处理BinaryOperator T apply(T t1, T t2) 二元操作 数学运算Function和 BiFunction? 是基础且通用的转换接口适用于各种复杂的类型转换场景。UnaryOperator和 BinaryOperator? 是前两者的特殊形式专门用于输入输出类型一致的特定场景使代码意图更明确。如果有需要也可以使用FunctionalInterface注解来定制契合某个业务的函数式接口。

相关新闻

Nanobot超轻量级OpenClaw部署教程:3步搭建Python开发环境

Nanobot超轻量级OpenClaw部署教程:3步搭建Python开发环境

Nanobot超轻量级OpenClaw部署教程:3步搭建Python开发环境 1. 引言 想快速搭建一个属于自己的AI助手,但又不想折腾复杂的部署流程?今天介绍的Nanobot可能就是你在找的解决方案。这个来自香港大学数据智能实验室的开源项目,用仅约…

2026/5/17 12:04:54 阅读更多 →
Asian Beauty Z-Image Turbo真实案例:为非遗刺绣传承人生成100+纹样载体人像

Asian Beauty Z-Image Turbo真实案例:为非遗刺绣传承人生成100+纹样载体人像

Asian Beauty Z-Image Turbo真实案例:为非遗刺绣传承人生成100纹样载体人像 1. 引言:当东方美学AI遇见非遗刺绣 你有没有想过,AI不仅能画人像,还能成为文化传承的“数字画笔”? 最近,我们团队遇到了一个…

2026/5/17 12:04:52 阅读更多 →
tui-image-editor避坑指南:在Vue3中实现图片裁剪/滤镜/标注的常见问题解决

tui-image-editor避坑指南:在Vue3中实现图片裁剪/滤镜/标注的常见问题解决

tui-image-editor 深度排雷:在 Vue 3 项目中驾驭图片编辑器的实战心法 如果你正在 Vue 3 项目中寻找一个功能强大的图片编辑器,TOAST UI Image Editor (tui-image-editor) 很可能已经进入了你的视野。它集裁剪、滤镜、标注、旋转等众多功能于一身&#x…

2026/5/17 12:04:52 阅读更多 →

最新新闻

C++容器——vector的基本实现(下)

C++容器——vector的基本实现(下)

在上一篇博客中已经讲述了vector的基本使用方法。为了更好的理解其底层原理和提高一定的代码能力,本篇博客将针对vector进行一个简单的基础实现。一.vector的基础实现由于vector是模板类,所以类内函数的定义和声明不能分开编写,否则会出现编译…

2026/7/3 17:29:55 阅读更多 →
sql语法- MyBatis 中 <association> 标签的作用 1对1的情况

sql语法- MyBatis 中 <association> 标签的作用 1对1的情况

之前我们都是普通查询, 现在我们有个疑问如果出现下面的定义的model 数据库能直接查询么, 就是sql查询出来能够映射 对象作为另外一个对象的属性 // 主对象 public class ProjInfoModel {private Long projId;private String projName;private ProjAppInfoModel projAppInfoMod…

2026/7/3 17:27:54 阅读更多 →
打造你的终极数字伙伴:用DyberPet桌面宠物框架重新定义桌面互动体验

打造你的终极数字伙伴:用DyberPet桌面宠物框架重新定义桌面互动体验

打造你的终极数字伙伴:用DyberPet桌面宠物框架重新定义桌面互动体验 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 你是否厌倦了单调的桌面背景?是否渴望…

2026/7/3 17:25:54 阅读更多 →
PIC18F8722外部EEPROM存储扩展实战指南

PIC18F8722外部EEPROM存储扩展实战指南

1. 为什么需要外部EEPROM存储扩展在嵌入式系统开发中,PIC18F8722这类微控制器自带有限的内部存储空间。以PIC18F8722为例,其内部EEPROM容量仅为1024字节(1KB),这对于需要存储大量配置参数、历史数据或日志记录的应用场…

2026/7/3 17:21:52 阅读更多 →
高效低查重!AI教材生成工具助力教师轻松完成教材编写

高效低查重!AI教材生成工具助力教师轻松完成教材编写

谁没有在编写教材时感到困惑呢? 面对一页空白的文档,沉思了半个多小时,知识点的整理似乎毫无头绪——是先讲解基本概念,还是先分享案例呢?章节的划分该按照逻辑、还是依据课时呢?不断修改的大纲总是无法符…

2026/7/3 17:21:52 阅读更多 →
从8万美元跌至千元级,车载激光雷达成本暴跌96%背后:芯片化、规模化与全场景落地实战

从8万美元跌至千元级,车载激光雷达成本暴跌96%背后:芯片化、规模化与全场景落地实战

目录 摘要 一、行业综述:激光雷达从天价科研设备到民用标配的蜕变 1.1 十年价格迭代核心数据 1.2 市场格局与产业现状 二、核心降本逻辑一:芯片化架构重构,从分立器件到单芯片集成 2.1 传统分立架构的致命成本缺陷 2.2 芯片化自研的核心降本原理 2.3 头部厂商差异化…

2026/7/3 17:19:52 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻