带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(3)

简介: 带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(3)

带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)https://developer.aliyun.com/article/1339968?groupCode=taobaotech


实现 bufferUntilChanged

 

image.png

 

 

 

Source.from(Arrays.asList("A", "B", "B", "C", "C", "C", "D"))
.statefulMap(
() -> (List<String>) new LinkedList<String>(), (buffer, element) -> {
if (buffer.size() > 0 && (!buffer.get(0).equals(element))) { return Pair.create(
new LinkedList<>(Collections.singletonList(element)), Collections.unmodifiableList(buffer));
} else { buffer.add(element);
return Pair.create(buffer, Collections.<String>emptyList());
}
},
Optional::ofNullable)
.filterNot(List::isEmpty)
.runForeach(System.out::println, system);
// prints
// [A]
// [B, B]
// [C, C, C]
// [D]

 

 

举一反三,如何实现 distinctUntilChanged呢 ?

 

实现 distinctUntilChanged

image.png

 

 

 

Source.from(Arrays.asList("A", "B", "B", "C", "C", "C", "D"))
.statefulMap( Optional::<String>empty, (lastElement, element) -> {
if (lastElement.isPresent() && lastElement.get().equals(element)) { return Pair.create(lastElement, Optional.<String>empty());
} else {
return Pair.create(Optional.of(element), Optional.of(element));
}
},
listOnComplete -> Optional.empty())
.via(Flow.flattenOptional())
.runForeach(System.out::println, system);
// prints
// A
// B
// C
// D

 

如果要实现聚合buffer呢?

带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(4)https://developer.aliyun.com/article/1339966?groupCode=taobaotech

相关文章
|
JSON 前端开发 Java
Json格式数据解析
Json格式数据解析
651 1
|
9月前
|
监控 安全 Java
|
人工智能 安全 API
大模型推理主战场:通信协议的标配
DeepSeek加速了模型平权,大模型推理需求激增,性能提升主战场从训练转向推理。SSE(Server-Sent Events)和WebSocket成为大模型应用的标配网络通信协议。SSE适合服务器单向推送实时数据,如一问一答场景;WebSocket支持双向实时通信,适用于在线游戏、多人协作等高实时性场景。两者相比传统HTTPS协议,能更好地支持流式输出、长时任务处理和多轮交互,满足大模型应用的需求。随着用户体量扩大,网关层面临软件变更、带宽成本及恶意攻击等挑战,需通过无损上下线、客户端重连机制、压缩算法及安全防护措施应对。
1804 176
大模型推理主战场:通信协议的标配
|
监控 Oracle Java
JDK 21中的分代ZGC:一场内存管理的革命
JDK 21引入了分代ZGC,为Java应用程序的内存管理带来了革命性的进步。分代ZGC通过将堆内存划分为年轻代和老年代,采用并发处理和染色指针技术,实现了高吞吐量、低延迟和更好的可扩展性。这一特性显著提升了系统的性能和稳定性。
1427 51
|
存储 监控 物联网
|
Java 测试技术 Maven
maven跳过单元测试-maven.test.skip和skipTests的区别
maven跳过单元测试-maven.test.skip和skipTests的区别
406 0
|
存储 缓存 监控
聊聊JIT是如何影响JVM性能的!
聊聊JIT是如何影响JVM性能的!
347 6
|
存储 程序员 编译器
堆和栈的区别
堆和栈的区别
|
缓存 Java Spring
源码解读:Spring如何解决构造器注入的循环依赖?
本文详细探讨了Spring框架中的循环依赖问题,包括构造器注入和字段注入两种情况,并重点分析了构造器注入循环依赖的解决方案。文章通过具体示例展示了循环依赖的错误信息及常见场景,提出了三种解决方法:重构代码、使用字段依赖注入以及使用`@Lazy`注解。其中,`@Lazy`注解通过延迟初始化和动态代理机制有效解决了循环依赖问题。作者建议优先使用`@Lazy`注解,并提供了详细的源码解析和调试截图,帮助读者深入理解其实现机制。
987 1
|
缓存 监控 JavaScript
7min 到 40s:Spring Boot 启动优化实践 上
7min 到 40s:Spring Boot 启动优化实践 上

热门文章

最新文章