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

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

一、Lambda 表达式基础

1. 替代匿名内部类

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

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

2. 函数式接口排序

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)

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)

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

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

3. 排序(Sorted)

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

// 转为 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)

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)

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

7. 匹配(Match)

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

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

8. 统计(Count/Sum/Average)

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)

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)

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

三、并行流(Parallel Stream)

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

总结特性:

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

  2. Stream API

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

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

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

  3. 常用操作分类:

    • 中间操作:filtermapsorteddistinct 等

    • 终止操作:collectforEachcountreduce 等

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

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

相关文章:

  • MySQL 复合索引
  • 使用 金南瓜EAP库 进行 二次开发与半导体厂家进行通讯源码
  • 《Vue全栈图形绘制系统开发实战》—— 第二章 Canvas 2D高级绘图系统
  • 安装、使用 tensorflow 遇到的问题
  • SpringBoot 2 后端通用开发模板搭建(异常处理,请求响应)
  • 【Vue工作原理】VueCli4 模板文件template不存在会生产一个默认文件原理
  • 【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,
  • NavVis VLX三维扫描:高层建筑数字化的革新力量【沪敖3D】
  • 1.2 Kaggle大白话:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据
  • SpringBoot项目注入 traceId 来追踪整个请求的日志链路
  • Failed to start The PHP FastCGI Process Manager.
  • 前端TypeScript 面试题及参考答案
  • pycharm 创建数据库 以及增删改查
  • AI探索笔记:浅谈人工智能算法分类
  • Matplotlib 绘图标记
  • WebView中操作视频播放,暂停
  • 鸿蒙(OpenHarmony/HarmonyOS)开发中常用的命令行工具及操作大全
  • SOC-ATF 安全启动BL1流程分析(1)
  • 【新立电子】探索AI眼镜背后的黑科技,FPC如何赋能实时翻译与语音识别,点击了解未来沟通的新方式!
  • LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法
  • java和php哪个做网站好/云南今日头条新闻
  • 国外网站购物/seo外链推广
  • 移动终端网站建设/谷歌账号注册
  • 手机版企业网站h5/株洲百度seo
  • 做投票页面什么网站好/seo关键词优化策略
  • pxhere素材网站/电商网络销售是做什么