Java8 - Streams flatMap()

news2024/11/17 15:51:42

文章目录

  • What is flatMap()?
  • Why flat a Stream?
  • Demo

在这里插入图片描述

What is flatMap()?

# Stream<String[]>
# Stream<Stream<String>>
# String[][]

[
  [1, 2],
  [3, 4],
  [5, 6]
]

它由一个 2 级 Stream 或一个二维数组组成 。

在 Java 8 中,我们可以使用 flatMap 将上述 2 级 Stream 转换为一级 Stream 或将 二维数组转换为 一维数组。

# Stream<String>
# String[]

[1, 2, 3, 4, 5, 6]

简言之, flatmap方法让你把一个流中的每个值都换成另一个流,然后把所有的流连接
起来成为一个流。

看一个简单的例子: 使用flatMap找出单词列表中各不相同的字符
在这里插入图片描述


Why flat a Stream?

处理包含多个级别的 Stream ,比如 Stream<String[]>Stream<List<LineItem>>Stream<Stream<String>> 想 将 2 级 Stream 扁平化为一级,如 Stream<String>Stream<LineItem>,这样就可以轻松地循环 Stream 并对其进行处理。

来看个简单的功能实现,以及常犯的一些错误。

需求: 有 {"a", "b"}, {"c", "d"}, {"e", "f"} 三个数组,要求输出 除去a之后的数据

 /**
     * filter out the a and print out all the characters
     */
    private static void filterAndPrintCharacters() {

        String[][] array = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};

        // convert  array to a stream
        Stream<String[]> stream = Arrays.stream(array);

        // array to a stream [same result]
        Stream<String[]> array1 = Stream.of(array);


        log.info("==========错误的方式一===============");

        //    x is a String[], not String!
        List<String[]> result = stream.filter(x -> !x.equals("a"))
                .collect(Collectors.toList());

        log.info(String.valueOf(result.size()));
        result.forEach(x -> log.info(Arrays.toString(x)));

        log.info("==========错误的方式二===============");

        List<String[]> result1 = Arrays.stream(array).filter(x -> {
            for (String s : x) {   // really?
                if (s.equals("a")) {
                    return false;
                }
            }
            return true;
        }).collect(Collectors.toList());

        log.info(String.valueOf(result1.size()));
        result1.forEach(x -> log.info(Arrays.toString(x)));


        log.info("============正确的方式 flatMap=============");

        log.info("============先测试转换成一维数组=============");
        // [a, b, c, d, e, f]
        String[] objects = Arrays.stream(array)
                .flatMap(Stream::of)
                .toArray(String[]::new);
        Arrays.stream(objects).forEach(x -> log.info("|---->{}", x));

        log.info("============开始处理=============");
        List<String> collect = Arrays.stream(array)
                .flatMap(Stream::of)
                .filter(x -> !x.equals("a"))
                .collect(Collectors.toList());

        collect.forEach(x -> log.info(x));
        log.info("============处理结束=============");

    }

我们先看看:

[错误的方式一]

filter(x -> !x.equals("a"))  // x 是数组 ,而非字符串 

[错误的方式二]

x -> {
  for (String s : x) {   // really?
         if (s.equals("a")) {
             return false;
         }
     }
     return true;
 }   //  会把整个 [a, b] 过滤出去,而非我们想要过滤的 a 

[正确的方式 ]

// flatMap 将二维数组转换成意味数组, 或者可以说是从 Stream<String[]> 转换成Stream<String>.

String[][] array = new String[][]{{"a", "b"}, {"c", "d"}, {"e", "f"}};

  // Java 8
  String[] result = Stream.of(array)  // Stream<String[]>
          .flatMap(Stream::of)        // Stream<String>
          .toArray(String[]::new);    // [a, b, c, d, e, f]

  Arrays.stream(objects).forEach(x -> log.info("|---->{}", x));

接下来我们就可以很轻松地过滤出来 a了, 就得到了一下最终版本

 List<String> collect = Arrays.stream(array)
                .flatMap(Stream::of)
                .filter(x -> !x.equals("a"))
                .collect(Collectors.toList());

 collect.forEach(x -> log.info(x));

【小结】

Stream#flatMap 可以将 2 levels Stream 转换成 1 level Stream.

Stream<String[]>      -> flatMap ->	Stream<String>
Stream<Set<String>>   -> flatMap ->	Stream<String>
Stream<List<String>>  -> flatMap ->	Stream<String>
Stream<List<Object>>  -> flatMap ->	Stream<Object>

在这里插入图片描述


Demo

需求: 使用 stream 将List转换为对象流,每个对象都包含一组书籍,使用flatMap生成包含所有对象中所有书籍的流。过滤掉包含单词python的书,并收集一个Set以删除重复的书。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端工程师leetcode算法面试必备-二分搜索算法(下)

一、287. 寻找重复数 给定一个包含 n 1 个整数的数组 nums&#xff0c;其数字都在 1 到 n 之间&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。假设只有一个重复的整数&#xff0c;找出这个重复的数。 1、HashMap 在没有其它附加条件的情况下&…

直属领导和老板都给了我绩效A,HR最后审核时降成了B,平时没有得罪她,她为什么这么做?...

绩效考核时&#xff0c;谁才是最终决定你绩效那个人&#xff1f;一位网友最近遇到了这样一件糟心事&#xff1a;季度绩效&#xff0c;直属领导和老板都给了A&#xff0c;人事最后审核时给降成了B&#xff0c;平时和人事没什么工作交集&#xff0c;按理说没有得罪她&#xff0c;…

Java工具——MySQL介绍与安装

Java工具——MySQL介绍与安装MySQL数据库介绍1. 简介2. MySQL发展历史MySQL数据库安装1. 下载安装包2. 安装3. 配置环境变量MySQL数据库介绍 1. 简介 MySQL是应用最广泛、普及度最高的开源关系型数据库&#xff0c;MySQL由瑞典MySQL AB公司开发&#xff0c;目前属于Oracle旗下…

Opencv 基本操作七 提取两幅图像的重叠区域

使用opencv提取连个图像的重叠区域&#xff0c;其本质就是提取两个图像的特征点&#xff0c;然后对两个图像的特征点进行匹配&#xff0c;根据匹配的特征点计算出透视变换矩阵H&#xff0c;然后根据H即可提取出两个图像的重叠区域。这里要注意的是&#xff0c;普通的opencv库没…

Kali Linux断网攻击

前言 ARP攻击就是通过伪造IP地址和MAC地址实现ARP欺骗&#xff0c;能够在网络中产生大量的ARP通信量使网络阻塞&#xff0c;攻击者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目&#xff0c;造成网络中断或中间人攻击。 一句话解释&#xff1a; 断…

2022年总结 | 从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年&#xff0c;这一年对于我来说是十分重要的一年。在这一年里&#xff0c;我作为一名初二在校学生&#xff0c;在CSDN上发布…

2003-2021年高铁站开通时间

2003-2021年高铁站开通时间数据 1、时间&#xff1a;2003-2021年 2、指标&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 3、指标说明&#xff1a; 高速铁路&#xff0c;简称高铁&#xff0c;是指设计标准等级高、可供列车安全高速行驶…

需要提醒你关于 golang 中 map 使用的几点注意事项

日常的开发工作中&#xff0c;map 这个数据结构相信大家并不陌生&#xff0c;在 golang 里面&#xff0c;当然也有 map 这种类型 关于 map 的使用&#xff0c;还是有蛮多注意事项的&#xff0c;如果不清楚&#xff0c;这些事项&#xff0c;关键时候可能会踩坑&#xff0c;我们…

【攻防世界】Web warmup

知识点讲解 这一题主要是利用了include的特性 如果include的文件名中含有“/”&#xff0c;那么它会识别其为一个带目录的文件&#xff0c;只有最后一个“/”后的字符串对应的文件会被包含&#xff0c;而前面的字符串都只是在指定目录 意思是&#xff0c;如果我们的payload是这…

ArcGIS基础实验操作100例--实验36创建特征线约束TIN

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验36 创建特征线约束TIN 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1…

搜狗PR权重在线查询,搜狗PR值查询方法

什么是搜狗PR权重&#xff1f; 搜狗权重(SogouRank)是由搜狗搜索引擎官方发布网页评级数据&#xff0c;搜狗权重是搜狗衡量网页重要性的指标&#xff0c;是机器根据搜狗评级算法自动计算出来的。搜狗权重值从1至10不等&#xff0c;网页评级越高&#xff0c;该网页在搜索中越…

异步通信技术AJAX | AJAX乱码问题、异步与同步、手动封装一个jQuery库

目录 一&#xff1a;快速搞定AJAX&#xff08;第三篇&#xff09; 1、AJAX乱码问题 2、AJAX的异步与同步 3、AJAX代码封装 4、手动封装一个jQuery库 一&#xff1a;快速搞定AJAX&#xff08;第三篇&#xff09; 1、AJAX乱码问题 &#xff08;1&#xff09;发送ajax get 或…

2022年我的22个感悟

这些感悟&#xff0c;有些是我自己感悟出来的&#xff1b;更有一些&#xff0c;是别人说的&#xff0c;引起了我的共鸣或深思。这些感悟&#xff0c;可能没有什么实用价值&#xff0c;但能让人对这个世界多一份思考。1. 现代社会的奴隶“小工是酒店或餐馆的奴隶&#xff0c;而他…

7-10 网红点打卡攻略

一个旅游景点&#xff0c;如果被带火了的话&#xff0c;就被称为“网红点”。大家来网红点游玩&#xff0c;俗称“打卡”。在各个网红点打卡的快&#xff08;省&#xff09;乐&#xff08;钱&#xff09;方法称为“攻略”。你的任务就是从一大堆攻略中&#xff0c;找出那个能在…

Python解题 - CSDN周赛第19期 - 醉酒的狱卒

本期题目依然难度不高&#xff0c;可惜状态不佳&#xff0c;未能取得满分&#xff0c;而且解题的思路也没能做到最简&#xff0c;直到赛后才想到还可以有另外的有趣的解法。我想这本身也是比赛的乐趣之一吧&#xff0c;不识庐山真面目&#xff0c;只缘身在此山中。 第一题&…

【阶段一】Python快速入门03篇:数据结构-元组、字典与集合

本篇的思维导图: 数据结构-元组 元组的概念 元组(tuple)虽然与列表类似,但也有不同之处,元组的元素不能修改;元组使用小括号,而列表使用中括号。 新建一个元组 元组的创建比较简单,直接将一组数据元素用小括号括起来即可。

第1章 生物和生物圈

张惠怡*&#xff0c;张钊* (萧县城东初级中学&#xff0c;淮北师范大学计算机科学与技术学院&#xff0c;安徽 淮北&#xff0c;安徽 宿州) *These authors contributed to the work equllly and should be regarded as co-first authors. &#x1f31e;欢迎来到生物的世界 …

校招前端二面高频vue面试题

vue-router中如何保护路由 分析 路由保护在应用开发过程中非常重要&#xff0c;几乎每个应用都要做各种路由权限管理&#xff0c;因此相当考察使用者基本功。 体验 全局守卫&#xff1a; const router createRouter({ ... }) ​ router.beforeEach((to, from) > {// .…

【LeetCode每日一题】——263.丑数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 263.丑数 四【题目描述】 丑数 就是只包含质因数 …

3GPP R17 RedCap

什么是RedCap RedCap&#xff0c;即Reduced Capability的简称&#xff0c;在早期的3GPP讨论过程中&#xff0c;它也被称为NR Light。RedCap是针对IoT场景&#xff0c;为了降低终端复杂度、成本和功耗而提出。相比NR标准版本&#xff0c;RedCap主要在如下几个方面做了简化&#…