为了账号安全,请及时绑定邮箱和手机立即绑定

Java开发面试中最常被问到的数据流处理问题

你肯定知道这事儿吧?
解释一下 Stream 中 map、flatMap 和 reduce 三者的区别。

映射函数接收一个数组作为输入,并将其每个元素转换后返回一个同样长度的新数组。映射会生成一个新的转换后的数据版本而不会改变原始数据。下面的映射函数接收一个 lambda 表达式作为参数来处理数据,在这种情况下,返回 ArrayList 中每个单词的长度。

    List<String> words = Arrays.asList("现代", "Java", "在", "行动");  
    List<Integer> wordLengths = words.stream()  
                                     .map(String::length)  
                                     .collect(Collectors.toList()); // 收集每个单词的长度到列表
    // 计算每个单词的长度

// 定义一个字符串列表words
// 使用Arrays.asList创建一个包含特定字符串的列表
// 使用流操作计算每个单词的长度
// 将计算结果收集到一个新的整数列表中

例如,给定词列表 ["Hello", "World"],你希望返回的列表是 ["H", "e", "l", "o", "W", "r", "d"]。这意味着你需要找出给定词列表中的所有唯一字母。

    //以上示例创建了一个单词的流。
    List<String> words = Arrays.asList("Modern", "Java", "In", "Action");
    words.stream()
         .map(word -> word.split(""))
         .map(Arrays::stream)
         .去重()
         .collect(Collectors.toList());
你可以发现上面方法的问题吗?

这种方法的问题是,传递给map方法的lambda表达式对于每个单词返回一个字符串数组。map方法返回的是一个类型为Stream<String[]> 的流。我们真正想要的是一个Stream<String>,即字符的流

FlatMap 用于展平流,例如将嵌套的流转换为单一的流。

解决 flatMap 的问题,flatMap 会返回 Stream<String> 而不是 Stream<String[]>。这样一来,你就可以在这个由列表中的所有单词展开得到的流上运行 distinct 操作。

     获取单词列表中所有的唯一字符:
     List<String> uniqueCharacters =  
      words.stream()  
           .map(word -> word.split(""))  
           .flatMap(Arrays::stream)  
           .distinct()  
           .collect(toList());

感谢阅读。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消