Lambda和Stream让代码简洁的七大原则

1. Lambda优于匿名内部类

  • 函数接口:JDK 8中,只存在一个抽象方法的接口称为函数接口,使用@FunctionalInterface注解标识。
  • 示例
    @FunctionalInterface
    public interface Comparator<T> {int compare(T o1, T o2);
    }
    
  • Lambda表达式:简化了匿名内部类的使用,使得代码更简洁。
    list.sort((o1, o2) -> o2.compareTo(o1));
    

2. 善用方法引用

  • 方法引用:比Lambda表达式更简洁,但有时过于简洁可能会降低可读性。
  • 示例
    list.sort(Comparator.reverseOrder());
    

3. 坚持使用标准函数接口

  • 标准函数接口:JDK 8的java.util.function包提供了多种标准函数接口,如PredicateSupplierConsumerFunction
    • Predicate<T>:返回布尔类型,判断输入参数是否满足条件。
    • Supplier<T>:不传参,提供一个结果。
    • Consumer<T>:传入参数不返回。
    • Function<T, R>:传入T类型,响应R类型。
  • 示例
    Predicate<Integer> isEven = n -> n % 2 == 0;
    Supplier<Integer> randomIntSupplier = () -> (int) (Math.random() * 100);
    Consumer<String> printer = message -> System.out.println(message);
    Function<String, String> getLastName = name -> name.split(" ")[1];
    

4. 谨慎使用Stream

  • 流式处理:JDK 8引入的Stream API,通过多重管道处理集合,但滥用Stream会降低代码的可读性和维护性。
  • 示例
    numbers.stream().filter(isEven).forEach(System.out::println);
    

5. 优先选择Stream中无副作用的函数

  • 无副作用函数:如filtermapsorted等,处理数据时不影响原集合。
  • 示例
    List<String> list = Arrays.asList("aaa", "b", "cc");
    List<Integer> lengths = list.stream().map(String::length).sorted().collect(Collectors.toList());
    

6. Stream优先用Collection为返回类型

  • 返回类型:使用Collection类型(如ListSet)作为返回类型,方便后续使用迭代或Stream。
  • 示例
    List<String> lists = Arrays.asList(" 菜菜", " caicai ", "小菜 ", "", " ");
    Stream<String> stream = lists.stream().filter(s -> !Objects.equals("", s.trim())).map(s -> s.trim());
    Collection<String> collect = stream.collect(Collectors.toCollection(ArrayList::new));
    

7. 谨慎使用Stream并行

  • 并行处理:使用parallel()开启并行处理,可以提高处理速度,但需注意数据一致性问题。
  • 示例
    static long piParallel(long n) {return LongStream.rangeClosed(2, n).parallel().mapToObj(BigInteger::valueOf).filter(i -> i.isProbablePrime(50)).count();
    }
    

总结

  • 函数接口:使用@FunctionalInterface注解,Lambda表达式实现简洁。
  • 方法引用:简洁但需注意可读性。
  • 标准函数接口:优先使用java.util.function提供的接口。
  • Stream:简化代码,但需注意滥用问题。
  • 无副作用函数:优先使用,处理完数据后再转换容器。
  • 返回类型:优先使用Collection类型。
  • 并行处理:提高速度,注意数据一致性。

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

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

相关文章

深入解读:几种常见视频大模型原理对比分析

在人工智能的快速发展中&#xff0c;视频分析技术逐渐成为研究的热点。伴随着深度学习的崛起&#xff0c;各种视频大模型应运而生&#xff0c;广泛应用于视频理解、动作识别、视频生成等领域。本文将对几种常见的视频大模型进行原理对比分析&#xff0c;帮助读者更好地理解它们…

JDK、JRE、JVM的区别

总结&#xff1a; JDK为开发人员提供了完整的开发和运行Java程序所需的工具和库&#xff0c;包括JRE、编译器&#xff08;javac&#xff09;、调试器&#xff08;jdb&#xff09;、Java类库&#xff08;如java标准库&#xff09;、基本开发工具&#xff1b; JRE为普通用户或需…

作业7.26~28

全双工&#xff1a; 通信双方 既可以发送&#xff0c;也可以接收数据 1. 利用多线程 或者 多进程&#xff0c; 实现TCP服务器 和 客户端的全双工通信 思路&#xff1a; 服务器和客户端&#xff0c; 在建立通信以后&#xff0c;可以创建线程&#xff0c;在线程编写另一个功能代…

实用网站推荐

​ 学习 前端 精简CSS格式 Font Awesome 图标库 BootCDN 加速服务 合集 AI工具集 动漫、音乐 娱乐 嗷呜动漫 奈飞同步 视频下载 B站视频解析下载 文件操作 ioDraw制作图 Convertio — 文件转换器 PDF处理 ​LOGO

python-小李帮老师改错(赛氪OJ)

[题目描述] 老师给小理发了一封电子邮件&#xff0c;任务如下。 写一个程序&#xff0c;给你 n 个数&#xff0c;输出 X。Xnum1p1​​num2p2​​⋯numnpn​​。 num1​&#xff0c;num2​&#xff0c;⋯⋯&#xff0c;numn​ 都是整数&#x…

图像处理 -- ISP的VA(Variation Accumulation)作用与实现原理

ISP的Variation Accumulation功能的作用与实现原理 ISP&#xff08;图像信号处理器&#xff09;的Variation Accumulation&#xff08;变异累积&#xff09;功能主要用于提高图像质量&#xff0c;尤其是在低光照条件下。其基本作用是通过对多帧图像的累积处理&#xff0c;降低…

sql注入和防止sql注入的方法

SQL注入&#xff08;SQL Injection&#xff09;是一种网络安全漏洞&#xff0c;允许攻击者在应用程序的SQL查询中插入恶意代码。这种攻击通常发生在应用程序没有正确验证或清理用户输入数据的情况下&#xff0c;导致攻击者能够操纵数据库查询&#xff0c;获取、修改或删除敏感信…

【脱敏】平台数据脱敏技术解决方案(word)

1 概述 1.1 数据脱敏定义 1.2 数据脱敏原则 1.2.1基本原则 1.2.2技术原则 1.2.3管理原则 1.3 数据脱敏常用方法 3.1.1泛化技术 3.1.2抑制技术 3.1.3扰乱技术 3.1.4有损技术 1.4 数据脱敏全生命周期 2 制定数据脱敏规程 3 发现敏感数据 4 定义脱敏规则 5 执…

02 Go语言开发REST API接口_20240728 课程笔记

概述 如果您没有Golang的基础&#xff0c;应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础 基础不好的同学每节课的代码最好配合视频进行阅读和学习&#xff0c;如果基础比较扎实&#xff0c;则阅读本教程巩固一下相关知识点即可&#xff0c;遇到不会…

探索Python监控之眼:watchdog库深度解析

文章目录 探索Python监控之眼&#xff1a;watchdog库深度解析1. 引言&#xff1a;为何选择watchdog&#xff1f;2. watchdog简介3. 安装watchdog库4. 基本函数与使用方法4.1 初始化监控器4.2 监控文件的创建4.3 监控文件的删除4.4 监控目录的创建4.5 监控目录的删除 5. 场景应用…

一文读懂JS事件循环、事件冒泡与事件委托

引言 JavaScript 是一种广泛使用的编程语言&#xff0c;特别是在前端开发领域。为了理解 JavaScript 中的异步行为和事件处理机制&#xff0c;我们需要深入了解事件循环、事件冒泡和事件委托等概念。本文将详细解释这些概念及其在实际编程中的应用。 1. JavaScript 事件循环 …

IoTDB 入门教程 实战篇②——MQTT集成

文章目录 一、前文二、配置参数三、开放端口四、MQTT客户端连接五、推送数据六、查询数据八、参考 一、前文 IoTDB入门教程——导读 IoTDB时序数据库内置MQTT服务器&#xff0c;允许远程设备将消息直接发送到IoTDB内置的MQTT服务器&#xff0c;并可以直接存入IoTDB时序数据库。…

gitee的远程连接与公钥SSH的连接

目录 1. 登录注册gitee1.1 登录注册1.2 创建仓库 2. 远程连接3. 公钥连接4. 参考链接 1. 登录注册gitee 1.1 登录注册 gitee官网 进入后进行登录注册 1.2 创建仓库 2. 远程连接 在你想要上传文件的文件夹中进行git初始化&#xff08;我在其他文章已经写过&#xff0c;链接…

新手小白,如何新建一个springboot的web项目?

第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选择java8版本 ④选择jar包类型 http://t.csdnimg.cn/XeplRhttp:…

ICMPv6与DHCPv6之网络工程师软考中级

ICMPv6概述 ICMPv6是IPv6的基础协议之一。 在IPv6报文头部中&#xff0c;Next Header字段值为58则对应为ICMPv6报文。 ICMPv6报文用于通告相关信息或错误。 ICMPv6报文被广泛应用于其它协议中&#xff0c;包括NDP、Path MTU发现机制等 ICMPv6控制着IPv6中的地址自动配置、地址…

tarojs项目启动篇

TaroJS 是一个开放式跨端开发解决方案&#xff0c;使用 React 语法规范来开发多端应用&#xff08;包括小程序、H5、React Native 等&#xff09;。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目&#xff08;本来就有的旧项目&#xff09;的步…

OTA远程升级语音芯片”在线更新语音内容的方式有哪几种?分别如何使用及有什么优势?

一&#xff1a;【在板更新】在PCBA上预留语音芯片烧录口,通过配套下载器更新语音芯片中的语音文件。 如何使用,有什么优势? 1.研发设计阶段、调试阶段可以使用下载器更换PCBA上面的语音文件&#xff0c;无需重新购买IC,大大缩短项目周期。 2.产品一样,但是需要出口到不同国…

request编码方式Content-Type以及params和data传参

编码x-www-form-urlencoded Content-Type: application/x-www-form-urlencoded 是一种HTTP头部信息&#xff0c;用于指定请求或响应正文的内容类型。 具体来说&#xff1a; Content-Type 是HTTP头部字段&#xff0c;它指示了随后发送或接收的实体正文的媒体类型。 applicati…

Mybatis框架基础知识

Mybatis 1.1什么是Mybatis 1.MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。 2.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 3.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO…

redis的使用场景-热点数据缓存

1.什么是缓存&#xff1f; 把一些经常访问的数据放入缓存中&#xff0c;减少访问数据库的频率&#xff0c;减少数据库的压力&#xff0c;从而提高程序的性能。【内存中存储】 2.缓存的原理 通过上图可以看出程序首先访问缓存&#xff0c;如果缓存中有访问的数据会直接方会给客…