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流遍历递归数据结构相关推荐

  1. 【Java数据结构】二叉树的前中后序遍历(递归和非递归)

    二叉树的遍历 递归做法 前序遍历 中序遍历 后序遍历 非递归 前序遍历 中序遍历 后序遍历 二叉树遍历是二叉树的一种重要操作 必须要掌握 二叉树的遍历可以用递归和非递归两种做法来实现 递归做法 前序遍 ...

  2. java数据结构二叉树遍历_java数据结构 之 二叉树的遍历(1)

    树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合.它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合 节点:上图的圆圈,比如A,B,C等都是表示 ...

  3. [Leetcode][第100题][JAVA][相同的树][二叉树][深度遍历][递归]

    [问题描述][中等] [解答思路] 深度遍历/递归 终止条件与返回值: 当两棵树的当前节点都为 null 时返回 true 当其中一个为 null 另一个不为 null 时返回 false 当两个都不 ...

  4. Java 后序遍历(递归、堆栈)

    递归 源代码: //后序遍历--递归public void theFirstTraversal(Node n){if(n.getLeftNode()!=null)theFirstTraversal(n ...

  5. java 中序遍历(递归、堆栈)

    递归 源代码: //中序遍历--递归public void theFirstTraversal(Node n){if(n.getLeftNode()!=null)theFirstTraversal(n ...

  6. java先序遍历树(递归、堆栈)

    第一种方式(递归) 代码: //先序遍历--递归public void theFirstTraversal(Node n){printNode(n);if(n.getLeftNode()!=null) ...

  7. 数据结构二叉树中序遍历递归和非递归算法

    2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...

  8. java Stream 流

    java Stream 流 Stream 流 流的创建 流的转化 Optianal 流的计算 Stream 流 1. Stream的定义 来自数据源的支持聚合操作的元素序列. 即一个流对外提供接口,接 ...

  9. 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 ...

最新文章

  1. Hermes实时检索分析平台
  2. Generator 函数的含义与用法
  3. Kotlin实战指南七:单例模式
  4. discuz! 7.2 manyou插件暴路径Get Webshell 0day
  5. Nginx常见面试题整理---40题
  6. 简单 申请 msn.com邮箱 @
  7. 大学英语综合教程二 Unit 1 到Unit 8 课文内容英译中 中英翻译
  8. 光电开关与光耦的区别 - 光电开关电子电路图
  9. ps 图片提取线稿方法2种 转
  10. 深入创新,共建原生 | 「DaoCloud 道客」与华钦科技签署合作备忘录
  11. 「信号机制」Python信号处理—signal模块
  12. app小窗口悬浮工具_悬浮助手SoftCircle
  13. 正则表达式?:代表什么意思
  14. python的for语句中i未被定义_python 报错 类名没有被定义
  15. 打印银行类,创建银行,实现存钱,取钱,转账
  16. oracle数据库dba面试题,DBA笔试题5:SQL汇总
  17. 新品发布 | 极海半导体工业级互联型APM32F107/F105系列MCU,拓展通信外设助力产品应用创新
  18. 基本算法4.1堆积木
  19. Usb硬件解析及设计
  20. POJ 2245 Addition Chains(算竞进阶习题)

热门文章

  1. 中控指纹采集器开发指纹识别项目(说明)
  2. 比特(bit)和字节(byte)(1byte=8bit)
  3. 文件上传与下载----SpringMVC
  4. count does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manu
  5. Linux中打包和解压到的方法
  6. 重新学习Spring一--Spring在web项目中的启动过程
  7. 构建maven项目插件_如何构建一个Maven插件
  8. junit5和junit4_JUnit 5 –基础
  9. lucene 查询示例_高级Lucene查询示例
  10. fork join框架_Fork / Join框架vs.并行流vs.ExecutorService:最终的Fork / Join基准