# java_idea_debug **Repository Path**: enzoism/java_idea_debug ## Basic Information - **Project Name**: java_idea_debug - **Description**: java_idea_debug - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-03 - **Last Updated**: 2026-09-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SpringBoot-Dive学习 -- -- # 1、 程序启动测试 - 访问地址:http://127.0.0.1:8071/ -- -- # Lambda表达式总结 ## 01-Lambda表达式语法 和 函数式接口(Functional Interface)关系 - Lambda 不只是"刚好可以"和函数式接口一起用,而是"只能"依附于函数式接口存在。 - Lambda 是函数式接口实例的速写语法。离开了函数式接口,Lambda 本身没有意义 ---- ## 02-为什么必须是"只有一个抽象方法"? 如果接口有两个抽象方法,Lambda 那一行 (a, b) -> a + b 到底实现哪个?编译器无法判断。所以 @FunctionalInterface 注解的作用就是让编译器帮你检查"这个接口确实只有一个抽象方法"(default 方法和 static 方法不算)。 ---- ## 03-Lambda 和匿名内部类不完全等价 - 底层实现不同:匿名内部类会编译出一个新的 .class 文件,而 Lambda 用的是 invokedynamic 指令 + 运行时动态生成,性能更好; - 另外 Lambda 里的 this 指向外层类,匿名内部类里的 this 指向它自己。 ---- ## 04-函数式接口出入参定义 ``` Consumer printer = s -> System.out.println("消费: " + s); printer.accept("Hello"); // 消费者-accept接收参数(没有返回值) Supplier random = () -> Math.random(); random.get(); // 提供者-get获取返回值(没有入参) Function len = s -> s.length(); data = len.apply("Java"); // 多功能函数-apply(接收入参,返回出参) Predicate isEven = n -> n % 2 == 0; data = isEven.test(4); // 特殊的多功能函数-test(接收入参,返回Boolean) ``` ---- ## 05-Lambda表达式使用心得 Python 保守(可读性优先)、Java 补课(拥抱函数式)、TypeScript 佛系(继承 JS 生态,不加评判) --- ## 06-中间操作 (intermediate operation) ```angular2html filter、 map、mapToInt、 mapToLong、mapToDouble flatMap、flatMapToInt、 flatMapToLong、flatMapToDouble mapMulti、mapMultiToInt, mapMultiToLong、mapMultiToDouble、 parallel、unordered、onClose、sequential distinct. sorted、peek、limit、skip、takeWhile、dropWhile、 ``` | 操作 | 作用 | 示例 | | ------------------------------------ | ---------------------- | ----------------------------------- | | `filter(Predicate)` | 过滤 | `filter(x -> x > 3)` | | `map(Function)` | 一对一转换 | `map(String::length)` | | `flatMap(Function)` | 一对多打平 | `flatMap(s -> s.chars()...)` | | `distinct()` | 去重(依赖 equals) | `distinct()` | | `sorted()` / `sorted(Comparator)` | 排序 | `sorted(Comparator.reverseOrder())` | | `peek(Consumer)` | 偷看一眼(调试用),不改数据 | `peek(System.out::println)` | | `limit(n)` | 截断取前 n 个 | `limit(10)` | | `skip(n)` | 跳过前 n 个 | `skip(3)` | | `takeWhile(Predicate)` | 按条件取,遇到不满足就停(JDK 9+) | `takeWhile(x -> x < 5)` | | `dropWhile(Predicate)` | 按条件丢,遇到不满足开始保留(JDK 9+) | `dropWhile(x -> x < 5)` | | `mapToInt / mapToLong / mapToDouble` | 转成数值流 | `mapToInt(Integer::intValue)` | | `boxed()` | 数值流转回对象流 | `IntStream.range(0,5).boxed()` | ---- ## 07-响应式编程 VS 命令式编程 ---- ## 08-正压 VS 背压 ### 背压理解-1 ``` 场景:Publisher 每秒生产 1000 条数据 Subscriber 每秒只能处理 10 条数据 无背压 → 数据堆积在内存 → OutOfMemoryError 有背压 → Subscriber 按需 request → 流量平衡 ``` ### 背压理解-2 ``` 传统 Tomcat: 1000 并发下载 10GB 文件 → 200 线程池瞬间耗尽 → 新请求 503 拒绝 Netty 响应式: 1000 并发下载 10GB 文件 → 4 个 EventLoop 线程轻松应对 → TCP 缓冲区满自动停止读取(自动背压) → 内存永远可控,不会 OOM ``` --- ## 09-开放式的讨论一个问题:线程越多越好,还是越少越好? - 用少量的线程一直忙,而不是让大量的线程一直切换等待(单位时间中一个CPU本质只能跑一个线程任务,如果分配了多个线程,就会轮询切换) - 最好是线程数 和 CPU 的速率是一致的,这样性能最高。 ---- ## 10-Reactive Stream诞生背景 ``` 公司: 1、100个活,20个员工,活越多招的员工越多:阻塞式 2、100个活,5个员工,无限压榨资源利用率。 目的:通过全异步的方式、加缓存区构建一个实时的数据流系统。 Kafka、MQ能构建出大型分布式的响应式系统。-> 但是缺【本地化的消息系统解决方案】: - 1)、让所有的异步线程能互相监听消息,处理消息,构建实时消息处理流 ``` ## 11-Reactive Stream-API组件 ```angular2html APl Components: 1.Publisher:发布者;产生数据流 2.Subscriber:订阅者;'消费数据流 3.Subscription:订阅关系; 1.订阅关系是发布者和订阅者之间的关键接口。订阅者通过订阅来表示对 发布者产生的数据的兴趣。订阅者可以请求一定数量的元素,也可以取消 订阅。 4.Processor:处理器; 1.处理器是同时实现了发布者和订阅者接口的组件。它可以接收来自一个 发布者的数据,进行处理,并将结果发布给下一个订阅者。处理器在 Reactor中充当中间环节,代表一个处理阶段,允许你在数据流中进行转 换、过滤和其他操作。 ```