地基JDK8新特性之Lambda 表达式和Stream 流操作

news/2025/2/27 11:35:01

一、Lambda 表达式基础

1. 替代匿名内部类

java">// 传统写法
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello World");
    }
};

// Lambda 写法
Runnable r2 = () ->  {
            System.out.println("hello");
        };

2. 函数式接口排序

java">List<String> list = Arrays.asList("apple", "banana", "orange");

// 传统 Comparator
list.sort(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.length() - s2.length();
    }
});

// Lambda 写法
list.sort((s1, s2) -> s1.length() - s2.length());

二、Stream 流操作

1. 过滤(Filter)

java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

// 获取所有偶数
List<Integer> evenNumbers = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList()); // [2, 4, 6]

2. 映射(Map)

java">List<String> words = Arrays.asList("java", "python", "c++");

// 转为大写
List<String> upperCaseWords = words.stream()
    .map(String::toUpperCase)
    .collect(Collectors.toList()); // [JAVA, PYTHON, C++]

3. 排序(Sorted)

java">List<String> names = Arrays.asList("Tom", "Jerry", "Alice");

// 按长度排序
List<String> sortedNames = names.stream()
    .sorted((s1, s2) -> s1.length() - s2.length())
    .collect(Collectors.toList()); // [Tom, Alice, Jerry]

4. 收集(Collect)转set、map

java">// 转为 Set
Set<Integer> numberSet = numbers.stream()
    .collect(Collectors.toSet());

// 转为 Map
Map<String, Integer> wordLengthMap = words.stream()
    .collect(Collectors.toMap(
        word -> word, 
        word -> word.length()
    ));

5. 去重(Distinct)

java">List<Integer> nums = Arrays.asList(1, 2, 2, 3, 3, 3);
List<Integer> distinctNums = nums.stream()
    .distinct()
    .collect(Collectors.toList()); // [1, 2, 3]

6. 限制和跳过(Limit & Skip)

java">// 分页操作:跳过前2个,取3个
List<Integer> page = numbers.stream()
    .skip(2)
    .limit(3)
    .collect(Collectors.toList()); // [3, 4, 5]

7. 匹配(Match)

java">boolean hasEven = numbers.stream()
    .anyMatch(n -> n % 2 == 0); // true

boolean allEven = numbers.stream()
    .allMatch(n -> n % 2 == 0); // false

8. 统计(Count/Sum/Average)

java">long count = numbers.stream().count(); // 6

int sum = numbers.stream()
    .mapToInt(Integer::intValue)
    .sum(); // 21

OptionalDouble avg = numbers.stream()
    .mapToInt(Integer::intValue)
    .average(); // 3.5

9. 分组(GroupingBy)

java">List<String> languages = Arrays.asList("Java", "Python", "C++", "JavaScript");

// 按字符串长度分组
Map<Integer, List<String>> groupByLength = languages.stream()
    .collect(Collectors.groupingBy(String::length));
// 输出:{2=[C++], 4=[Java], 6=[Python], 10=[JavaScript]}

10. 连接字符串(Joining)

java">String joined = languages.stream()
    .collect(Collectors.joining(", "));
// 输出:Java, Python, C++, JavaScript

三、并行流(Parallel Stream)

java">// 使用并行流提升处理速度
long count = numbers.parallelStream()
    .filter(n -> n % 2 == 0)
    .count();

总结特性:

  1. Lambda 表达式:简化匿名内部类,使代码更简洁

  2. Stream API

    • 链式调用:支持多个操作串联

    • 延迟执行:只有遇到终止操作时才会执行

    • 并行处理:通过 parallelStream() 实现并行化

  3. 常用操作分类:

    • 中间操作:filtermapsorteddistinct 等

    • 终止操作:collectforEachcountreduce 等

通过组合这些操作,可以高效处理集合数据,且代码可读性大幅提升。

(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)


http://www.niftyadmin.cn/n/5870051.html

相关文章

7. 覆盖率:covergroup/coverpoint/cross

文章目录 前言一、核心概念剖析1. covergroup‌2.coverpoint‌3. cross‌4. 覆盖率三要素对比表 二、实现模式指南2.1 covergroup2.2 coverpoint2.3 cross2.3 拓展知识1. 智能bins生成‌2. 权重控制‌3. 条件覆盖‌4. 自动分仓5. 手动分仓6. 条件过滤 三、典型应用场景3.1 cove…

15.代码随想录算法训练营第十五天|(递归)110. 平衡二叉树,257. 二叉树的所有路径*,404. 左叶子之和,222.完全二叉树的节点个数[打卡自用]

15.代码随想录算法训练营第十五天|&#xff08;递归&#xff09;110. 平衡二叉树&#xff0c;257. 二叉树的所有路径*&#xff0c;404. 左叶子之和&#xff0c;222.完全二叉树的节点个数 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xf…

在 macOS 系统上安装 kubectl

在 macOS 系统上安装 kubectl 官网&#xff1a;https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-macos/ 用 Homebrew 在 macOS 系统上安装 如果你是 macOS 系统&#xff0c;且用的是 Homebrew 包管理工具&#xff0c; 则可以用 Homebrew 安装 kubectl。 运行…

如何解决svn st中出现!(冲突)的问题

在 SVN&#xff08;Subversion&#xff09;中&#xff0c;svn status 命令用于查看工作副本的状态。当你看到 ! 符号时&#xff0c;通常表示文件或目录在工作副本中丢失&#xff08;missing&#xff09;。以下是解决这个问题的步骤&#xff1a; 1. 理解 ! 的含义 ! 表示该文件…

【2025全网最新最全】前端Vue3框架的搭建及工程目录详解

文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址&#xff1a;https://nodejs.org/zh-cn/ 安装完成后&#xff0c;打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…

基于Spring Boot的健康医院门诊在线挂号系统设与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Redis缓存淘汰算法——LRU

文章目录 一、LRU 算法概述1.1 LRU 算法的工作原理1.2 手写LRU 二、Redis 中的 LRU 算法2.1 近似 LRU 算法2.2 如何判断“最近最少使用”的键&#xff1f;2.3 Redis 中的 LRU 配置 在 Redis 中&#xff0c; LRU&#xff08;Latest Recently Used&#xff0c;最近最少使用&…

聚焦低空经济,峰飞航空飞行汽车开启未来出行新篇章

曾经只存在于科幻电影中的“飞行汽车”&#xff0c;如今正以eVTOL&#xff08;电动垂直起降飞行器&#xff09;的形式加速落地&#xff0c;成为全球科技竞争的新焦点。作为低空经济的核心载体之一&#xff0c;eVTOL不仅承载着缓解地面交通压力的使命&#xff0c;更被视为推动城…