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();

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

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

相关文章

keep-alive缓存

#keep-alive缓存动态路由的使用指南# 代码如下图 &#xff1a; <router-view v-slot"{ Component }"> <keep-alive :include"[Hot, Notifications, User, Setting, Test]"> <component :is"Component" …

使用 PyTorch 的 `GradualWarmupScheduler` 实现学习率预热

使用 PyTorch 的 GradualWarmupScheduler 实现学习率预热 在深度学习中,学习率(Learning Rate, LR)是影响模型训练效果的关键超参数之一。为了提升模型的收敛速度和稳定性,学习率调度策略变得尤为重要。其中,学习率预热(Learning Rate Warmup) 是一种常用的策略,它通过…

【DLI】Generative AI with Diffusion Models通关秘籍

Generative AI with Diffusion Models&#xff0c;加载时间在20分钟左右&#xff0c;耐心等待。 6.2TODO 这里是在设置扩散模型的参数&#xff0c;代码里的FIXME部分需要根据上下文进行替换。以下是各个FIXME的替换说明&#xff1a; 1.a_bar 是 a 的累积乘积&#xff0c;在 …

如何在本地部署魔搭上千问Qwen2.5-VL-32B-Instruct-AWQ模型在显卡1上面运行推理,并开启api服务

环境: 云服务器Ubuntu NVIDIA H20 96GB Qwen2.5-VL-32B Qwen2.5-VL-72B 问题描述: 如何在本地部署魔搭上千问Qwen2.5-VL-32B-Instruct-AWQ模型在显卡1上面运行推理,并开启api服务 解决方案: 1.环境准备 硬件要求 显卡1(显存需≥48GB,推荐≥64GB)CUDA 11.7或更高…

基于方法分类的无监督图像去雾论文

在之前的博客中&#xff0c;我从研究动机的角度对无监督图像去雾论文进行了分类&#xff0c;而现在我打算根据论文中提出的方法进行新的分类。 1. 基于对比学习的方法 2022年 论文《UCL-Dehaze: Towards Real-world Image Dehazing via Unsupervised Contrastive Learning》&a…

4月3号.

JDK7前时间相关类: 时间的相关知识: Data时间类: //1.创建对象表示一个时间 Date d1 new Date(); //System.out.println(d1);//2.创建对象表示一个指定的时间 Date d2 new Date(0L); System.out.println(d2);//3.setTime修改时间 //1000毫秒1秒 d2.setTime(1000L); System.o…

数据结构与算法:子数组最大累加和问题及扩展

前言 子数组最大累加和问题看似简单,但能延伸出的题目非常多,千题千面,而且会和其他算法结合出现。 一、最大子数组和 class Solution { public:int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int>dp(n);//i位置往左能延伸出的最大累加…

MIT6.828 Lab3-2 Print a page table (easy)

实验内容 实现一个函数来打印页表的内容&#xff0c;帮助我们更好地理解 xv6 的三级页表结构。 修改内容 kernel/defs.h中添加函数声明&#xff0c;方便其它函数调用 void vmprint(pagetable_t);// lab3-2 Print a page tablekernel/vm.c中添加函数具体定义 采用…

2025高频面试设计模型总结篇

文章目录 设计模型概念单例模式工厂模式策略模式责任链模式 设计模型概念 设计模式是前人总结的软件设计经验和解决问题的最佳方案&#xff0c;它们为我们提供了一套可复用、易维护、可扩展的设计思路。 &#xff08;1&#xff09;定义&#xff1a; 设计模式是一套经过验证的…

Java基础:面向对象进阶(二)

01-static static修饰成员方法 static注意事项&#xff08;3种&#xff09; static应用知识&#xff1a;代码块 static应用知识&#xff1a;单列模式 02-面向对象三大特征之二&#xff1a;继承 什么是继承&#xff1f; 使用继承有啥好处? 权限修饰符 单继承、Object类 方法重…

Spring框架如何做EhCache缓存?

在Spring框架中&#xff0c;缓存是一种常见的优化手段&#xff0c;用于减少对数据库或其他资源的访问次数&#xff0c;从而提高应用性能。Spring提供了强大的缓存抽象&#xff0c;支持多种缓存实现&#xff08;如EhCache、Redis、Caffeine等&#xff09;&#xff0c;并可以通过…

NVIDIA显卡

NVIDIA显卡作为全球GPU技术的标杆&#xff0c;其产品线覆盖消费级、专业级、数据中心、移动计算等多个领域&#xff0c;技术迭代贯穿架构创新、AI加速、光线追踪等核心方向。以下从技术演进、产品矩阵、核心技术、生态布局四个维度展开深度解析&#xff1a; 一、技术演进&…

【BUG】生产环境死锁问题定位排查解决全过程

目录 生产环境死锁问题定位排查解决过程0. 表面现象1. 问题分析&#xff08;1&#xff09;数据库连接池资源耗尽&#xff08;2&#xff09;数据库锁竞争(3) 代码实现问题 2. 分析解决(0) 分析过程&#xff08;1&#xff09;优化数据库连接池配置&#xff08;2&#xff09;优化数…

【计算机网络应用层】

文章目录 计算机网络应用层详解一、前言二、应用层的功能三、常见的应用层协议1. HTTP/HTTPS&#xff08;超文本传输协议&#xff09;2. DNS&#xff08;域名系统&#xff09;3. FTP&#xff08;文件传输协议&#xff09;4. SMTP/POP3/IMAP&#xff08;电子邮件协议&#xff09…

Linux 虚拟化方案

一、Linux 虚拟化技术分类 1. 全虚拟化 (Full Virtualization) 特点&#xff1a;Guest OS 无需修改&#xff0c;完全模拟硬件 代表技术&#xff1a; KVM (Kernel-based Virtual Machine)&#xff1a;主流方案&#xff0c;集成到 Linux 内核 QEMU&#xff1a;硬件模拟器&…

树莓派 5 换清华源

首先备份原设置 cp /etc/apt/sources.list ~/sources.list.bak cp /etc/apt/sources.list.d/raspi.list ~/raspi.list.bak修改配置 /etc/apt/sources.list 文件替换内容如下&#xff08;原内容删除&#xff09; deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm …

WGAN原理及实现(pytorch版)

WGAN原理及实现 一、WGAN原理1.1 原始GAN的缺陷1.2 Wasserstein距离的引入1.3 Kantorovich-Rubinstein对偶1.4 WGAN的优化目标1.4 数学推导步骤1.5 权重裁剪 vs 梯度惩罚1.6 优势1.7 总结 二、WGAN实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模…

Unity网络开发基础 (3) Socket入门 TCP同步连接 与 简单封装练习

本文章不作任何商业用途 仅作学习与交流 教程来自Unity唐老狮 关于练习题部分是我观看教程之后自己实现 所以和老师写法可能不太一样 唐老师说掌握其基本思路即可,因为前端程序一般不需要去写后端逻辑 1.认识Socket的重要API Socket是什么 Socket&#xff08;套接字&#xff0…

【linux】一文掌握 ssh和scp 指令的详细用法(ssh和scp 备忘速查)

文章目录 入门连接执行SCP配置位置SCP 选项配置示例ProxyJumpssh-copy-id SSH keygenssh-keygen产生钥匙类型known_hosts密钥格式 此快速参考备忘单提供了使用 SSH 的各种方法。 参考&#xff1a; OpenSSH 配置文件示例 (cyberciti.biz)ssh_config (linux.die.net) 入门 连…

真实笔试题

文章目录 线程题树的深度遍历 线程题 实现一个类支持100个线程同时向一个银行账户中存入一元钱.需通过同步机制消除竞态条件,当所有线程执行完成后,账户余额必须精确等于100元 package com.itheima.thread;public class ShowMeBug {private double balance; // 账户余额priva…