MST

星途 面试题库

面试题:Java中Stream的flatMap方法与map方法的区别及应用场景

请详细阐述Java Stream中flatMap方法和map方法在功能、处理数据结构及应用场景上的区别,并各举一个实际的代码示例。
13.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 功能区别

  • map方法:对Stream中的每个元素应用一个函数,将其映射成一个新的元素,生成一个新的Stream,新Stream的元素个数与原Stream相同。
  • flatMap方法:对Stream中的每个元素应用一个函数,该函数返回一个Stream,然后将这些Stream扁平化为一个新的Stream,新Stream的元素个数可能与原Stream不同。

2. 处理数据结构区别

  • map方法:适用于处理单个元素,不改变数据结构的维度。例如,将一个包含字符串的Stream中的每个字符串转换为其长度,新Stream依然是一维的。
  • flatMap方法:常用于处理嵌套的数据结构,比如一个包含多个List的Stream,通过flatMap可以将其扁平化为一个包含所有List元素的一维Stream。

3. 应用场景区别

  • map方法:当需要对Stream中的每个元素进行简单转换,且不改变数据结构的层次时使用。例如,将一组数字转换为它们的平方。
  • flatMap方法:当需要处理嵌套结构的数据,将其扁平化时使用。比如,将一个包含多个单词列表的Stream,合并为一个包含所有单词的Stream。

4. 代码示例

map方法示例

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MapExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> squaredNumbers = numbers.stream()
              .map(n -> n * n)
              .collect(Collectors.toList());
        System.out.println(squaredNumbers); 
    }
}

flatMap方法示例

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        List<List<String>> lists = Arrays.asList(
                Arrays.asList("a", "b"),
                Arrays.asList("c", "d"),
                Arrays.asList("e", "f")
        );
        List<String> flatList = lists.stream()
              .flatMap(List::stream)
              .collect(Collectors.toList());
        System.out.println(flatList); 
    }
}