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

lambdastream深入剖析

语雀版:https://www.yuque.com/g/mingrun/embiys/eabrg26xsx4x8u4k/collaborator/join?token=TU6BLu8LBQxL8czK&source=doc_collaborator# 《lambda&stream深入剖析》

基础概念

  1. lambda在编程中的叫法是匿名函数(Anonymous Function),匿名函数(英语:Anonymous Function)在计算机编程中是指一类无需定义标识符(函数名)的函数或子程序。
    Lambda 在编程语言中往往是一个匿名函数,也就是说Lambda 是一个抽象概念,而编程语言提供了配套支持,比如在 Java 中其实为Lambda 进行配套的就是函数式接口通过函数式接口生成匿名类和方法进行Lambda 式的处理。
  2. Lambda所能提供的优点 在java中则由函数式接口所提供,函数式接口提供了一些通用性的能力,这些接口在sdk中有一套完整的实现,或者说是最佳实践,这就是stream流
  3. 句法
() -> System.out.println("零参数 lambda");
p -> System.out.println("一个参数:" + p);
(p1 [,p2,p3,....pn]) -> System.out.println("多个参数:" + p1 + ", " + p2 + ... + pn);
(parameter1, parameter2) -> { code block [return] }
  1. 方法引用
//静态方法
Consumer<String> c = [ (s) -> System.out.println(s);  <=>  System.out::println; ]
//实例方法
List<String> list = Lists.newArrayList();
Consumer<String> c = [ (e) -> list.add(e);  <=>  list::add; ]
//构造器 :: new
Supplier<List<String>> s = [ () -> new ArrayList<>(); <=> ArrayList::new; ]

原生函数式接口

@FunctionalInterface注解
有且只有一个抽象方法的接口被称为函数式接口,函数式接口适用于函数式编程的场景,Lambda就是Java中函数式编程的体现,可以使用Lambda表达式创建一个函数式接口的对象,一定要确保接口中有且只有一个抽象方法,这样Lambda才能顺利的进行推导。
与@Override 注解的作用形似,Java 8中专门为函数式接口引入了一个新的注解:@FunctionalInterface 。
该注解可用于一个接口的定义上,一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法(equal和hashcode方法不算),否则将会报错。但是这个注解不是必须的,只要符合函数式接口的定义,那么这个接口就是函数式接口。
  1. Consumer<T>: 消费性接口:
    1. 消费(1..n 入参, 无返回)
    2. 应用:list.foreach(System.out::println); //打印数组
  1. Supplier<T>: 供给型接口
    1. 获取(无入参,有返回)
    2. 通过泛型 T 定义了一个返回值类型,但是没有入参,它代表你可以针对调用方获取某个值,比较典型的例子是 Stream 中的 collect 方法,通过自定义传入我们想要取得的某种对象进行对象收集。
      List<String> list = Stream.of("a", "b", "c").collect(Collectors.toList());
http://www.dtcms.com/a/277344.html

相关文章:

  • [办公及工程版浏览器]_Google Chrome 138.0.7204.101全屏启动插件
  • 【Java Stream】基本用法学习
  • Vue 3 TypeScript 接口(Interface)使用
  • 反射内存卡的使用
  • 【Linux系统与网络编程】13:线程同步
  • AWS Lambda Container 方式部署 Flask 应用并通过 API Gateway 提供访问
  • C++ 模板元编程 type_traits
  • RedisJSON 技术揭秘`JSON.ARRTRIM`用窗口裁剪,让数组保持“刚刚好”
  • 5G NR PDCCH之处理流程
  • [Nagios Core] CGI接口 | 状态数据管理.dat | 性能优化
  • k8s存储入门
  • RabbitMQ 之仲裁队列
  • Matplotlib 中 plt.pcolormesh 函数的使用详解
  • 【sql学习之拉链表】
  • 【LLM-Agent】Qwen-Agent智能体框架使用
  • trySend、Channel 和 Flow 的工作原理
  • 【CMake】CMake创建、安装、使用静态库和动态库
  • 操作系统-第四章存储器管理和第五章设备管理-知识点整理(知识点学习 / 期末复习 / 面试 / 笔试)
  • 【hivesql 已知维度父子关系加工层级表】
  • C++每日刷题day2025.7.13
  • 什么是RAG(Retrieval-Augmented Generation)?一文读懂检索增强生成
  • RabbitMQ面试精讲 Day 2:RabbitMQ工作模型与消息流转
  • 12.I/O复用
  • 前端性能与可靠性工程:资源优化 - 加载性能的“低垂果实”
  • 从零开始学习深度学习-水果分类之PyQt5App
  • SpringBoot集成Redis、SpringCache
  • C++ 强制类型转换
  • 【操作系统】strace 跟踪系统调用(一)
  • (LeetCode 每日一题) 2410. 运动员和训练师的最大匹配数(排序、双指针)
  • es里为什么node和shard不是一对一的关系