使用Java 8流遍历递归数据结构
Streams API是Java 8中的真正瑰宝,我一直在为它们寻找或多或少的意外用途。 我最近写过有关将它们用作ForkJoinPool门面的文章 。 这是另一个有趣的例子:遍历递归数据结构。
事不宜迟,请看一下代码:
class Tree {private int value;private List<Tree> children = new LinkedList<>();public Tree(int value, List<Tree> children) {super();this.value = value;this.children.addAll(children);}public Tree(int value, Tree... children) {this(value, asList(children));}public int getValue() {return value;}public List<Tree> getChildren() {return Collections.unmodifiableList(children);}public Stream<Tree> flattened() {return Stream.concat(Stream.of(this),children.stream().flatMap(Tree::flattened));}
}
除了一些突出显示的行以外,这非常无聊。
假设我们希望能够找到匹配树中某些条件的元素或找到特定元素。 一种典型的实现方法是递归函数-但它具有一定的复杂性,并且可能需要可变的参数(例如,可以附加匹配元素的集合)。 另一种方法是使用堆栈或队列进行迭代。 它们工作正常,但是需要几行代码,而且很难一概而论。
这是我们可以使用该flattened
函数执行的操作:
// Get all values in the tree:
t.flattened().map(Tree::getValue).collect(toList());// Get even values:
t.flattened().map(Tree::getValue).filter(v -> v % 2 == 0).collect(toList());// Sum of even values:
t.flattened().map(Tree::getValue).filter(v -> v % 2 == 0).reduce((a, b) -> a + b);// Does it contain 13?
t.flattened().anyMatch(t -> t.getValue() == 13);
我认为该解决方案非常巧妙且用途广泛。 一行代码(在博客上为了便于阅读,这里分成3行)足以将树扁平化为一个简单的流,可以对其进行搜索,过滤和其他操作。
但这并不是完美的:它不是惰性的,并且每次都会为树中的每个节点调用flattened
。 使用Supplier
可能会改进它。 无论如何,对于典型的,相当小的树而言,这并不重要,尤其是在非常高的库堆栈上的业务应用程序中。 但是对于非常大的树,非常频繁的执行和严格的时间限制,开销可能会带来一些麻烦。
翻译自: https://www.javacodegeeks.com/2015/03/walking-recursive-data-structures-using-java-8-streams.html
使用Java 8流遍历递归数据结构相关推荐
- 【Java数据结构】二叉树的前中后序遍历(递归和非递归)
二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...
- java数据结构二叉树遍历_java数据结构 之 二叉树的遍历(1)
树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...
- [Leetcode][第100题][JAVA][相同的树][二叉树][深度遍历][递归]
[问题描述][中等] [解答思路] 深度遍历/递归 终止条件与返回值: 当两棵树的当前节点都为 null 时返回 true 当其中一个为 null 另一个不为 null 时返回 false 当两个都不 ...
- Java 后序遍历(递归、堆栈)
递归 源代码: //后序遍历--递归public void theFirstTraversal(Node n){if(n.getLeftNode()!=null)theFirstTraversal(n ...
- java 中序遍历(递归、堆栈)
递归 源代码: //中序遍历--递归public void theFirstTraversal(Node n){if(n.getLeftNode()!=null)theFirstTraversal(n ...
- java先序遍历树(递归、堆栈)
第一种方式(递归) 代码: //先序遍历--递归public void theFirstTraversal(Node n){printNode(n);if(n.getLeftNode()!=null) ...
- 数据结构二叉树中序遍历递归和非递归算法
2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...
- java Stream 流
java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...
- java 8流在另一个流_Java 8流– Java流
java 8流在另一个流 Welcome to Java 8 Stream API tutorial. In the last few java 8 posts, we looked into Jav ...
最新文章
- Hermes实时检索分析平台
- Generator 函数的含义与用法
- Kotlin实战指南七:单例模式
- discuz! 7.2 manyou插件暴路径Get Webshell 0day
- Nginx常见面试题整理---40题
- 简单 申请 msn.com邮箱 @
- 大学英语综合教程二 Unit 1 到Unit 8 课文内容英译中 中英翻译
- 光电开关与光耦的区别 - 光电开关电子电路图
- ps 图片提取线稿方法2种 转
- 深入创新,共建原生 | 「DaoCloud 道客」与华钦科技签署合作备忘录
- 「信号机制」Python信号处理—signal模块
- app小窗口悬浮工具_悬浮助手SoftCircle
- 正则表达式?:代表什么意思
- python的for语句中i未被定义_python 报错 类名没有被定义
- 打印银行类,创建银行,实现存钱,取钱,转账
- oracle数据库dba面试题,DBA笔试题5:SQL汇总
- 新品发布 | 极海半导体工业级互联型APM32F107/F105系列MCU,拓展通信外设助力产品应用创新
- 基本算法4.1堆积木
- Usb硬件解析及设计
- POJ 2245 Addition Chains(算竞进阶习题)
热门文章
- 中控指纹采集器开发指纹识别项目(说明)
- 比特(bit)和字节(byte)(1byte=8bit)
- 文件上传与下载----SpringMVC
- count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manu
- Linux中打包和解压到的方法
- 重新学习Spring一--Spring在web项目中的启动过程
- 构建maven项目插件_如何构建一个Maven插件
- junit5和junit4_JUnit 5 –基础
- lucene 查询示例_高级Lucene查询示例
- fork join框架_Fork / Join框架vs.并行流vs.ExecutorService:最终的Fork / Join基准