继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

忽然笑
关注TA
已关注
手记 352
粉丝 64
获赞 277

你肯定知道这事儿吧?
解释一下 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());

感谢阅读。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP