我有这两个代码示例:

代码A:

Stream aStream = firstLevelList.stream()

.flatMap(firstLevelElement -> firstLevelElement.getSecondLevelList().stream()

.flatMap(secondLevelElement -> secondLevelElement.getThirdLevelList().stream()

.map(thirdLevelElement -> thirdLevelElement.toString())));

代码B:

Stream aStream = firstLevelList.stream()

.flatMap(firstLevelElement -> firstLevelElement.getSecondLevelList().stream())

.flatMap(secondLevelElement -> secondLevelElement.getThirdLevelList().stream())

.map(thirdLevelElement -> thirdLevelElement.toString());

两者都有完全相同的结果,这是最好的实现?为什么?

最佳答案 选项1

以下内容读得很好,感觉更常见:

firstLevelList.stream()

.flatMap(firstLevelElement -> firstLevelElement.getSecondLevelList().stream())

.flatMap(secondLevelElement -> secondLevelElement.getThirdLevelList().stream())

.map(Object::toString);

它避免了@Holger指出的嵌套,这对读者来说很重要.

选项2

或者,如果它与代码库样式的其余部分不相符,我们可以使用不同的缩进来进行嵌套:

firstLevelList.stream().flatMap(

firstLevelElement -> firstLevelElement.getSecondLevelList().stream().flatMap(

secondLevelElement -> secondLevelElement.getThirdLevelList().stream().map(Object::toString)

)

);

选项3

如果它仍然感觉太神秘,我们可以提取变量或方法来命名不同的流:

firstLevelList.stream().flatMap(

firstLevelElement -> firstLevelElement.getSecondLevelList().stream().flatMap(

secondLevelElement -> getThirdLevelStream(secondLevelElement)

)

);

Stream getThirdLevelStream(SecondLevelElement secondLevelElement) {

return secondLevelElement.getThirdLevelList().stream().map(Object::toString);

}

选项4

我们可以将这些方法移动到现在关注Law of Demeter的元素类:

firstLevelList.stream().flatMap(FirstLevelElement::getSecondLevelStream);

class FirstLevelElement {

Stream getSecondLevelStream() {

return this.getSecondLevelList().stream().flatMap(SecondLevelElement::getThirdLevelStream);

}

Collection getSecondLevelList() {...}

}

class SecondLevelElement {

Stream getThirdLevelStream() {

return this.getThirdLevelList().stream().map(Object::toString);

}

Collection getThirdLevelList() {...}

}

如果在方法中的其他地方重用流方法,这将添加一些值.

结论

关于哪些选项更好,可以提出不同的论点.一般来说,它们都非常好.

java7 flatmap_Java 8多级flatMap最佳实现相关推荐

  1. java7 flatmap_Java 8 Streams FlatMap方法示例

    问题 我一直在查看即将发布的Java update,即:Java 8 or JDK 8.是的,我很不耐烦,有很多新东西,但是,有一些我不明白的东西,一些简单的代码: final Streamstrea ...

  2. java flatmap_Java 8 Steam API map和flatMap方法使用详解

    java 8 stream api 中有两个方法map和flatMap非常实用,应用场景也非常广泛,能极大提升编程效率.下面我们详细介绍一下这两个方法的用法. map方法 我们来看个示例:把一个整数列 ...

  3. java7 flatmap_flink学习之七-map、fliter、flatmap

    看完了Flink的datasource.sink,也就把一头一尾给看完了,从数据流入到数据流出,缺少了中间的处理环节. 而flink的大头恰恰是只在这个中间环节,如下图: source-transfo ...

  4. 多级中间表示概述MLIR

    多级中间表示概述MLIR MLIR项目是一种构建可重用和可扩展的编译器基础结构的新颖方法.MLIR旨在解决软件碎片,改善异构硬件的编译,显着降低构建特定于域的编译器的成本以及帮助将现有编译器连接在一起 ...

  5. MLIR多级中间表示概述

    MLIR多级中间表示概述 MLIR项目是构建可重用和可扩展的编译器基础设施的一种新方法.MLIR旨在解决软件碎片化问题,改进异构硬件的编译,显著降低构建特定领域编译器的成本,并帮助将现有编译器连接在一 ...

  6. 《转载》Java异常处理的10个最佳实践

    本文转载自 ImportNew - 挖坑的张师傅 异常处理在编写健壮的 Java 应用中扮演着非常重要的角色.异常处理并不是功能性需求,它需要优雅地处理任何错误情况,比如资源不可用.非法的输入.nul ...

  7. Dockerfile 最佳实践

    之前 一篇文章介绍 docker 的镜像基本原理和概念 ,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法. 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以 ...

  8. 【转】Java中关于异常处理的十个最佳实践

    原文地址:http://www.searchsoa.com.cn/showcontent_71960.htm 导读:异常处理是书写强健Java应用的一个重要部分,Java许你创建新的异常,并通过使用 ...

  9. Spark、Flink、CarbonData技术实践最佳案例解析

    当前无论是传统企业还是互联网公司对大数据实时分析和处理的要求越来越高,数据越实时价值越大,面向毫秒~秒级的实时大数据计算场景,Spark和Flink各有所长.CarbonData是一种高性能大数据存储 ...

最新文章

  1. 文件处理(如果文件存在则追加,不存在则生成多级文件夹以及txt目录)
  2. PAT甲级1059 Prime Factors :[C++题解]分解质因子
  3. python 匿名函数捕获变量值 (执行时的值)
  4. OpenWrt——配置L2TP客户端
  5. ACCESS 文本文件导入和导出指定字段类型的方法
  6. 使用trackBy启动流程
  7. JAVA进阶教学之(StringBuider进行字符串拼接)
  8. [转载] 聚类算法总结
  9. POJ 1952 DP
  10. 关于mongodb的学习与探索二
  11. 面试中常见智力题汇总
  12. 大数据可以应用在哪些行业?
  13. Hypervisor介绍
  14. 2021年中国商品期货交易规模分析:交易量达71.71亿手,同比增长21.15%[图]
  15. 输入一个正整数,求出它是几位数
  16. 时间序列模型预测_时间序列预测,使用facebook先知模型预测股价
  17. c语言实现cgi之cgic库使用
  18. 安卓游戏时禁止状态栏下拉_Android手机屏蔽状态栏下拉
  19. VM Workstation 16 Pro 下载安装以及下载配置Linux虚拟机(操作如下)
  20. 雄关漫道真如铁,而今迈步从头越.

热门文章

  1. Java里坦克大战第一次爆炸效果不显现,后面有效果图解决方案
  2. 手机验证的正则表达式
  3. Multer的基本使用
  4. HTTP协议中常见的状态码及其含义
  5. 人生重要的不是能力而是性格(75条)
  6. 使用Fiddler进行Mock测试的原理和方法
  7. Mitov MegaLab VCL 和 FireMonkey
  8. Visual Studio远程调试
  9. 除以13(高精度计算)
  10. 软件测试金融测试岗位,本人亲面