Java/일반

.map()과 .flatMap()의 차이

창욱씨 2020. 4. 10. 22:45

1. .map()

 .map()은 단일 스트림의 원소를 매핑시킨 후 매핑시킨 값을 다시 스트림으로 변환하는 중간 연산을 담당합니다. 객체에서 원하는 원소를 추출해는 역할을 한다고 말할 수 있습니다. 아래의 예시를 살펴보겠습니다.

Person.java

class Person {
    int age;
    String name;
    ...
}

MapTest.java

List<Person> sample = Arrays.asList(
  new Person(20, "park");
  new Person(35, "kyung");
  new Person(67, "seok");
  new Person(10, "test man");
  new Person(45, "test woman");
);

//List -> Stream<Person> -> map -> Stream<String>
Stream<String> mapStream = sample.stream().map(person -> person.getName());

mapStream.forEach(System.out::println);

output

park
kyung
seok
test man
test woman

2. .flatMap()

 .flatMap()은 Array나 Object로 감싸져 있는 모든 원소를 단일 원소 스트림으로 반환합니다. .map()은 입력한 원소를 그대로 스트림으로 반환하지만 .flatMap()은 입력한 원소를 가장 작은 단위의 단일 스트림으로 반환합니다. 이는 아래의 그림과 같습니다.

withoutFlatMap.java

String[][] sample = new String[][]{
  {"a", "b"}, {"c", "d"}, {"e", "a"}, {"a", "h"}, {"i", "j"}
};

//without .flatMap()
Stream<String> stream = sample.stream()
  .filter(alpha -> "a".equals(alpha[0].toString() || "a".equals(alpha[1].toString())))
stream.forEach(alpha -> System.out.println("{"+alpha[0]+", "+alpha[1]+"}"));

output

{a, b}
{e, a}
{a, h}

FlatMapTest.java

String[][] sample = new String[][]{
  {"a", "b"}, {"c", "d"}, {"e", "a"}, {"a", "h"}, {"i", "j"}
};

//without .flatMap()
Stream<String> stream = sample.stream()
  .flatMap(array -> Arrays.stream(array))
  .filter(x-> "a".equals(x));

stream.forEach(System.out::println);

output

a
a
a

참조: https://qkrrudtjr954.github.io/java/2017/10/15/difference-between-map-and-flatMap.html

728x90