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

Java Lambda 表达式提升效率

  • lambda 表达式的应用场景

  • Stream 的应用场景

  • Lambda/Stream 的进一步封装

自定义函数式接口(用 jdk 自带的函数式接口也可以)

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

import java.io.Serializable;/*** 可序列化的Functional** @author VampireAchao*/
@FunctionalInterface
public interface Func<T, R> extends Serializable {/*** 调用** @param t 参数* @return 返回值*/R apply(T t);
}/*** 可序列化的函数式接口实现类** @author VampireAchao*/
public class FuncImpl implements Func<Object, String> {/*** 调用** @param o 参数* @return 返回值*/@Overridepublic String apply(Object o) {return o.toString();}
}Func<String, Integer> func = new Func<String, Integer>() {/*** 调用** @param s 参数* @return 返回值*/@Overridepublic Integer apply(String s) {return s.hashCode();}};

Lambda 这种简写的形式

java.util.stream (Java Platform SE 8 )

 Func<String, String> func1 = (String s) -> {return s.toUpperCase();};Func<String, String> func2 = (String s) -> s.toUpperCase();
Func<String, String> func3 = s -> s.toUpperCase();
Func<String, String> func4 = String::toUpperCase;import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Supplier;/*** 语法糖——方法引用** @author VampireAchao*/
public class MethodReferences {public static Object staticSupplier() {return "whatever";}public Object instanceSupplier() {return "whatever";}public Object anonymousInstanceFunction() {return "whatever";}public static void main(String[] args) {// 引用构造函数Supplier<MethodReferences> conSup = () -> new MethodReferences();conSup = MethodReferences::new;// 数组构造函数引用IntFunction<int[]> intFunction = value -> new int[value];// intFunc == new int[20];int[] intFuncResult = intFunction.apply(20);// 引用静态方法Supplier<Object> statSup = () -> staticSupplier();statSup = MethodReferences::staticSupplier;Object statSupResult = statSup.get();// 引用特定对象的实例方法Supplier<Object> instSup = new MethodReferences()::instanceSupplier;instSup = new MethodReferences()::instanceSupplier;Object instSupResult = instSup.get();// 引用特定类型的任意对象的实例方法Function<MethodReferences, Object> anonInstFunc = streamDemo -> streamDemo.anonymousInstanceFunction();anonInstFunc = MethodReferences::anonymousInstanceFunction;}}

jdk 自带的函数式接口写法

import java.math.BigDecimal;
import java.util.function.*;/*** 常用的几个函数式接口写法** @author VampireAchao*/
class Usual {public static Consumer<Object> consumer() {// 有参数无返回值return o -> {};}public static Function<Integer, Object> function() {// 有参数有返回值return o -> o;}public static Predicate<Object> predicate() {// 有参数,返回值为booleanreturn o -> true;}public static Supplier<Object> supplier() {// 无参数有返回值return Object::new;}public static BiConsumer<String, Integer> biConsumer() {// 俩参数无返回值return (q, o) -> {};}public static BiFunction<Integer, Long, BigDecimal> biFunction() {// 俩参数,有返回值return (q, o) -> new BigDecimal(q).add(BigDecimal.valueOf(o));}public static UnaryOperator<Object> unaryOperator() {// 一个参数,返回值类型和参数一样return q -> q;}public static BinaryOperator<Object> binaryOperator() {// 俩参数和返回值类型保持一致return (a, o) -> a;}}

Java 8 API 的抽象称为流 Stream

java.util.stream (Java Platform SE 8 )

    // 声明式编程是告诉计算机需要计算“什么”而不是“如何”去计算// 现在,我想要一个List,包含3个数字6List<Integer> sixSixSix =// 我想要:Stream// 数字6.generate(() -> 6)// 3个.limit(3)// 最后收集起来转为List.collect(Collectors.toList());sixSixSix.forEach(System.out::print);//Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。// 就像sql里的排序、截取// 我要把传入的list逆序,然后从第五个(元素下标为4)开始取值,取4条abc = abc.stream()// 排序(按照自然顺序的逆序).sorted(Comparator.reverseOrder())// 从下标为4开始取值.skip(4)// 取4条.limit(4)// 最后收集起来转为List.collect(Collectors.toList());System.out.println("我要把传入的list逆序,然后从第五个(元素下标为4)开始取值,取4条");abc.forEach(System.out::print);System.out.println();/*** 老办法实现一个list,存储3个6** @return [6, 6, 6]*/private static List<Integer> oldSix() {// 老办法List<Integer> sixSixSix = new ArrayList<>(3);sixSixSix.add(6);sixSixSix.add(6);sixSixSix.add(6);System.out.println("老办法实现一个list,存储3个6");for (Integer integer : sixSixSix) {System.out.print(integer);}System.out.println();return sixSixSix;}/*** 新方法实现一个list,存储3个6** @return [6, 6, 6]*/private static List<Integer> newSix() {List<Integer> sixSixSix = Stream.generate(() -> 6).limit(3).collect(Collectors.toList());System.out.println("新方法实现一个list,存储3个6");sixSixSix.forEach(System.out::print);System.out.println();return sixSixSix;}// 管道中传输,节点中处理int pipe = abc.stream()// 筛选.filter(i -> i > 'G')// 排序.sorted(Comparator.reverseOrder()).mapToInt(Object::hashCode)// 聚合.sum();System.out.println("将26个字母组成的集合过滤出大于'G'的,逆序,再获取hashCode值,进行求和");System.out.println(pipe);//元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作 (terminal operation) 得到前面处理的结果。// 将26个大写字母Character集合转换为String然后转换为小写字符List<String> terminalOperation = abc.stream()// 中间操作(intermediate operation).map(String::valueOf).map(String::toLowerCase)// 最终操作(terminal operation).collect(Collectors.toList());System.out.println("26个大写字母Character集合,转换成String然后转换为小写字符,收集起来");terminalOperation.forEach(System.out::print);System.out.println();

相关文章:

Java Lambda 表达式提升效率

lambda 表达式的应用场景 Stream 的应用场景 Lambda/Stream 的进一步封装 自定义函数式接口&#xff08;用 jdk 自带的函数式接口也可以&#xff09; https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html import java.io.Serializable;/*** 可序…...

人工智能混合编程实践:C++ ONNX进行图像超分重建

人工智能混合编程实践:C++ ONNX进行图像超分重建 前言相关介绍C++简介ONNX简介ONNX Runtime 简介**核心特点**图像超分辨率重建简介应用场景前提条件实验环境项目结构使用C++ ONNX进行图像超分重建sr_main.cpp参考文献前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多…...

K8S学习之基础七十四:部署在线书店bookinfo

部署在线书店bookinfo 在线书店-bookinfo 该应用由四个单独的微服务构成&#xff0c;这个应用模仿在线书店的一个分类&#xff0c;显示一本书的信息&#xff0c;页面上会显示一本书的描述&#xff0c;书籍的细节&#xff08;ISBN、页数等&#xff09;&#xff0c;以及关于这本…...

Python不可变数据类型全解析:原理、优势与实战指南

目录 引言&#xff1a;为什么Python要区分可变与不可变&#xff1f; 一、不可变数据类型的核心特性 二、五大不可变数据类型深度解析 三、不可变数据类型的三大核心优势 四、不可变数据类型的典型应用场景 五、不可变 vs 可变&#xff1a;如何选择&#xff1f; 六、实战技…...

六.FFmpeg对mp4文件操作(ubuntu)

一.抽取aac数据 1.代码抽取aac没有声音&#xff0c;使用ffmpeg命令行也无法转换为wav 问题解决&#xff1a;ADTS头的采样率没有设置正确&#xff0c;av_dump_format 获取视频信息的时候可以看到aac的详细信息。 void Widget::adts_header(char *szAdtsHeader, int dataLen) …...

Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座

在全球 290 位开发者的协作下&#xff0c;Apache Doris 在 2024 年完成了 7000 次代码提交&#xff0c;并发布了 22 个版本&#xff0c;实现在实时分析、湖仓一体和半结构化数据分析等核心场景的技术突破及创新。 2025 年&#xff0c;Apache Doris 社区将秉承“以场景驱动创新…...

HTTP数据传输的几个关键字Header

本文着重针对http在传输数据时的几种封装方式进行描述。 1. Content-Type(描述body内容类型以及字符编码) HTTP的Content-Type用于定义数据传输的媒体类型&#xff08;MIME类型&#xff09;&#xff0c;主要分为以下几类&#xff1a; (一)、‌基础文本类型‌ text/plain‌ …...

二极管正负极区分

二极管正负极区分 二极管是一种具有单向导电性的半导体器件&#xff0c;正确区分正负极对于其使用非常重要。以下是几种常见的二极管正负极区分方法&#xff1a; 1. 外观标识 有标记的二极管 色环或色点&#xff1a;许多二极管在表面会有一个色环或色点&#xff0c;这个标记…...

CyclicBarrier、Semaphore、CountDownLatch的区别,适用场景

CyclicBarrier、Semaphore 和 CountDownLatch 是 Java 并发包中用于线程协作的工具类&#xff0c;它们虽然都与线程同步相关&#xff0c;但设计目的和使用场景有显著差异。以下是它们的核心区别和典型应用场景&#xff1a; 1. CountDownLatch 核心机制 一次性计数器&#xf…...

【c++深入系列】:类与对象详解(中)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 不是因为看到希望才坚持&#xff0c;而是坚持了才能看到希望 那么上一篇博客我讲解了什么是类和对象以及类和对象是怎么定义的&#xff0…...

解锁界面设计密码,打造极致用户体验

界面设计是对软件、网站、移动应用等产品的用户界面进行设计的过程&#xff0c;旨在为用户提供美观、易用、高效的交互体验。以下是关于界面设计的一些主要方面&#xff1a; 一、设计原则 用户中心原则&#xff1a;以用户为中心&#xff0c;了解用户的需求、期望、行为和习惯…...

用Python和Pygame创造粉色粒子爱心:3D渲染的艺术

引言 在计算机图形学中&#xff0c;3D效果的2D渲染是一个迷人的领域。今天&#xff0c;我将分享一个使用Python和Pygame库创建的粉色粒子爱心效果。这个项目不仅视觉效果惊艳&#xff0c;而且代码简洁易懂&#xff0c;非常适合图形编程初学者学习3D渲染的基础概念。 项目概述…...

汽车 HMI 设计的发展趋势与设计要点

一、汽车HMI设计的发展历程与现状 汽车人机交互界面&#xff08;HMI&#xff09;设计经历了从简单到复杂、从单一到多元的演变过程。2012年以前&#xff0c;汽车HMI主要依赖物理按键进行操作&#xff0c;交互方式较为单一。随着特斯拉Model S的推出&#xff0c;触控屏逐渐成为…...

《AI大模型应知应会100篇》第56篇:LangChain快速入门与应用示例

第56篇&#xff1a;LangChain快速入门与应用示例 前言 最近最火的肯定非Manus和OpenManus莫属&#xff0c;因为与传统AI工具仅提供信息不同&#xff0c;Manus能完成端到端的任务闭环。例如用户发送“筛选本月抖音爆款视频”&#xff0c;它会自动完成&#xff1a; 爬取平台数据…...

vue-office 支持预览多种文件(docx、excel、pdf、pptx)预览的vue组件库

官网地址&#xff1a;https://github.com/501351981/vue-office 支持多种文件(docx、excel、pdf、pptx)预览的vue组件库&#xff0c;支持vue2/3。也支持非Vue框架的预览。 1.在线预览word文件&#xff08;以及本地上传预览&#xff09; 1.1&#xff1a;下载组件库 npm inst…...

Java 大视界 -- Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用(165)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…...

哈希表系列一>两数之和

目录 题目&#xff1a;方法&#xff1a;暴力代码&#xff1a;优化后代码&#xff1a; 题目&#xff1a; 链接: link 方法&#xff1a; 暴力代码&#xff1a; public int[] twoSum(int[] nums, int target) {解法一&#xff1a;暴力解法&#xff1a;int n nums.length;for(int…...

【SPP】深入解析蓝牙 L2CAP 协议在SPP中的互操作性要求

在蓝牙协议体系中,L2CAP(Logical Link Control and Adaptation Protocol)作为基带协议与高层协议之间的桥梁,承担着数据分帧、协议复用、QoS协商等核心功能。当涉及串行端口通信时,L2CAP的规范实现直接决定了设备间数据传输的可靠性、效率及兼容性。本文基于《Serial Port…...

CAD插件实现:自动递增编号(前缀、后缀、位数等)——CADc#实现

cad中大量输入一定格式的递增编号时&#xff0c;可用插件实现&#xff0c;效果如下&#xff1a; ①本插件可指定数字位数、起始号码、加前缀、后缀、文字颜色等&#xff08;字体样式和文字所在图层为cad当前图层和当前字体样式&#xff09;。 ②插件采用Jig方式&#xff0c;即…...

Spring | Spring、Spring MVC 和 Spring Boot 的区别

关注&#xff1a;CodingTechWork 引言 在 Java 开发领域&#xff0c;Spring、Spring MVC 和 Spring Boot 是三个经常被提及的概念。它们之间既有联系又有区别&#xff0c;对于初学者来说可能会感到困惑。本文将详细介绍它们的区别&#xff0c;并通过示例代码帮助读者更好地理解…...

观察者模式在Java微服务间的使用

一.、使用RabbitMQ来实现 (1) 生产者&#xff08;订单微服务&#xff09; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.stereotype.Service;Service public class OrderService {private final RabbitTemplate rabbitTemplate;…...

C语言--回文字符串

输入&#xff1a;字符串&#xff0c;判断是否是回文字符串&#xff0c;例如abcba输出Yes 输出&#xff1a;是否 代码 思路&#xff1a;使用两个指针分别指向头和尾&#xff0c;依次对比第一个元素和最后一个元素&#xff0c;第二个和倒数第二个元素&#xff0c;如果遇到不相同…...

【云计算物理网络】数据中心网络架构设计

云计算的物理基础&#xff1a;数据中心网络架构设计 一、技术背景&#xff1a;从“三层架构”到“云原生网络”二、技术特点&#xff1a;云数据中心网络的四大支柱三、技术细节&#xff1a;CLOS架构的实现挑战四、未来方向&#xff1a;从“连接设备”到“感知服务”结语&#x…...

Coco-AI 支持嵌入,让你的网站拥有 AI 搜索力

在之前的实践中&#xff0c;我们已经成功地把 Hexo、Hugo 等静态博客和 Coco-AI 检索系统打通了&#xff1a;只要完成向量化索引&#xff0c;就可以通过客户端问答界面实现基于内容的智能检索。 这一层已经很好用了&#xff0c;但总觉得少了点什么—— 比如用户还得专门打开一…...

批处理脚本的主要解析规则

批处理脚本的主要解析规则 批处理脚本(Batch files)有一套独特的解析规则&#xff0c;这些规则在很多情况下不太直观&#xff0c;但了解它们对于编写可靠的脚本至关重要。以下是最重要的一些规则&#xff1a; 1. 变量扩展规则 标准变量扩展 (%变量%) 解析时扩展&#xff1a…...

TRDI 公司的RiverPro 和 RioPro ADCP 用户指南

TRDI 公司 RiverPro 和 RioPro ADCP 用户指南 简介第一章 - 概述第二章 - 安装第三章 - 采集数据第四章 - 维护第五章 - 测试RIVERPRO/RIOPRO第六章 - 故障排除第七章 - 将系统返回TRDI进行维修第八章 - 规格第九章 - 命令第十章 - 输出数据格式附录A-合规通知首次完整翻译《Ri…...

Linux 基础入门操作 前言 linux操作指令介绍

1 linux 目录介绍 Linux 文件系统采用层次化的目录结构&#xff0c;所有目录都从根目录 / 开始 1.1 核心目录 / (根目录) 整个文件系统的起点、包含所有其他目录和文件 /bin (基本命令二进制文件) 存放系统最基本的shell命令&#xff1a;如 ls, cp, mv, rm, cat 等&#…...

【总结】SQL注入防护手段

1、对提交的数据进行数据类型判断&#xff0c;比如id值必须是数字&#xff1a;is_numeric&#xff08;$id&#xff09; 2、对提交的数据进行正则匹配&#xff0c;禁止出现注入语句&#xff0c;比如union、or、and等 3、对提交数据进行特殊符号转义&#xff0c;比如单引号、双引…...

OpenCV 图形API(11)对图像进行掩码操作的函数mask()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 对矩阵应用掩码。 该函数mask设置来自给定矩阵的值&#xff0c;如果掩码矩阵中对应的像素值设为true&#xff0c;否则将矩阵的值设为0。 支持的源矩阵…...

使用C#写的一个Kafka的使用工具

由于offset不支持通过界面推送数据&#xff0c;所以我写了一个kafka的连接工具&#xff0c;能够直接从界面推送数据&#xff0c;方便使用。由于使用的是C#写的&#xff0c;所以比offset要流畅的多。 1、数据源连接 2、获取集群的topic 3、点击获取数据能够获取最新的100条数…...