Java의 flatMap

Mohammad Irfan 2023년10월12일
  1. Java의 flatMap 함수
  2. Java에서 flatMap() 메소드를 사용하는 방법
  3. Java의 flatMap에서 중복 제거
  4. Java에서 flatMap 요소 필터링
  5. flatMap 및 기본 유형
  6. 결론
Java의 flatMap

이 튜토리얼에서는 flatMap과 Java에서 사용하는 방법을 소개합니다.

flatMap은 일부 기능 작업을 수행한 후 새 스트림을 가져오는 데 사용되는 Java 스트림의 작업/기능입니다. 여기에서는 flatMap() 작업에 대해 이야기하겠습니다.

이 작업은 map() 작업의 확장입니다. 이 함수는 각 스트림 요소에 적용되고 새 값의 스트림을 생성합니다.

그런 다음 이러한 새 스트림에서 생성된 요소는 메서드의 반환 값으로 사용되는 최근에 생성된 스트림에 복사됩니다.

Java의 flatMap 함수

flatMap() 함수의 서명은 다음과 같습니다.

<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)

flatMap은 중간 작업입니다. 중간 작업은 지연 작업이며 Stream 인스턴스에서 호출되며 처리가 완료된 후 Stream 인스턴스를 반환합니다.

flatMap() 작업은 map()flat() 작업의 조합입니다. 즉, flatMap() 작업은 먼저 map() 작업을 적용한 다음 결과를 평면화합니다.

이 메서드는 들어오는 Stream의 각 요소에 적용되는 기능인 매퍼를 사용합니다.

Java에서 병합

먼저 평면화가 무엇인지 이해합시다. 목록을 병합하면 둘 이상의 수준 목록이 단일 수준 목록으로 변환됩니다.

2단계 목록의 예는 다음과 같습니다.

[[ "I" ], [ "Love" ], [ "Delft", "Stack" ]]

병합 후 위의 목록은 다음으로 변환됩니다.

["I", "Love", "Delft", "Stack"]

생성된 목록은 단일 수준 목록입니다.

목록 병합의 필요성

여러 스트림 수준을 처리하는 것은 어렵고 복잡하며 오류가 발생하기 쉬우므로 목록을 평면화할 필요가 있습니다.

Stream.flatMap() 작업을 사용하여 두 스트림 수준을 단일 수준 스트림으로 변환할 수 있습니다. 이 기사의 뒷부분에서 예제를 사용하여 이것을 이해할 것입니다.

Java에서 flatMap() 메소드를 사용하는 방법

이 예제에서는 먼저 stream() 메서드를 사용하여 List에서 객체 스트림을 생성했습니다. 각 개체는 회사의 프로그래머입니다.

먼저 회사의 개발자/프로그래머를 나타내는 클래스를 만듭니다.

import java.util.HashSet;
import java.util.Set;
class Programmer {
  private String name;
  private Set<String> languages_known;

  public Programmer(String name) {
    this.name = name;
    this.languages_known = new HashSet<>();
  }

  public void addLanguage(String lang) {
    this.languages_known.add(lang);
  }

  public Set<String> getLanguages() {
    return languages_known;
  }
}

이제 개체를 초기화하고 회사 전체의 프로그래머가 알고 있는 모든 언어를 포함하는 목록 목록을 만듭니다. 그런 다음 해당 목록을 평면화하여 팀의 모든 언어를 알 수 있습니다.

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    Programmer raj = new Programmer("Raj");
    raj.addLanguage("Java");
    raj.addLanguage("Dart");
    raj.addLanguage("go");
    raj.addLanguage("groovy");

    Programmer karan = new Programmer("Karan");
    karan.addLanguage("Java");
    karan.addLanguage("Python");

    Programmer chahal = new Programmer("Chahal");
    chahal.addLanguage("Dart");
    chahal.addLanguage("Javascript");

    List<Programmer> team = new ArrayList<>();
    team.add(raj);
    team.add(karan);
    team.add(chahal);

    System.out.println("Programming languages in the team: ");
    List<String> languages = team.stream()
                                 .map(Programmer::getLanguages)
                                 .flatMap(Collection::stream)
                                 .collect(Collectors.toList());
    System.out.println(languages);
  }
}

출력:

Programming languages in the team: 
[Java, groovy, go, Dart, Java, Python, Javascript, Dart]

위의 예에서 우리는 먼저 스트림 API를 사용하여 모든 프로그래머의 스트림을 생성했습니다. 그 후 map() 함수를 사용하여 각 프로그래머가 알고 있는 언어 목록 스트림을 만들었습니다.

Java의 flatMap에서 중복 제거

그런 다음 flatMap() 작업을 사용하여 이 목록을 평면화하고 결과 스트림을 목록으로 변환합니다. 생성된 목록에는 일부 중복 값이 ​​있습니다. 이를 제거하기 위해 duplicate() 작업을 사용합니다.

아래 코드를 보십시오.

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    Programmer raj = new Programmer("Raj");
    raj.addLanguage("Java");
    raj.addLanguage("Dart");
    raj.addLanguage("go");
    raj.addLanguage("groovy");
    Programmer karan = new Programmer("Karan");
    karan.addLanguage("Java");
    karan.addLanguage("Python");
    Programmer chahal = new Programmer("Chahal");
    chahal.addLanguage("Dart");
    chahal.addLanguage("Javascript");
    List<Programmer> team = new ArrayList<>();
    team.add(raj);
    team.add(karan);
    team.add(chahal);
    System.out.println("Programming languages in the team: ");
    List<String> languages = team.stream()
                                 .map(Programmer::getLanguages)
                                 .flatMap(Collection::stream)
                                 .distinct()
                                 .collect(Collectors.toList());
    System.out.println(languages);
  }
}

출력:

Programming languages in the team: 
[Java, groovy, go, Dart, Python, Javascript]

Java에서 flatMap 요소 필터링

Dart를 제외한 모든 언어를 얻으려면 flatMap()과 함께 filter() 함수를 사용할 수 있습니다. 아래 코드를 보십시오.

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class SimpleTesting {
  public static void main(String[] args) {
    Programmer raj = new Programmer("Raj");
    raj.addLanguage("Java");
    raj.addLanguage("Dart");
    raj.addLanguage("go");
    raj.addLanguage("groovy");
    Programmer karan = new Programmer("Karan");
    karan.addLanguage("Java");
    karan.addLanguage("Python");
    Programmer chahal = new Programmer("Chahal");
    chahal.addLanguage("Dart");
    chahal.addLanguage("Javascript");
    List<Programmer> team = new ArrayList<>();
    team.add(raj);
    team.add(karan);
    team.add(chahal);
    System.out.println("Programming languages in the team: ");
    List<String> languages = team.stream()
                                 .map(Programmer::getLanguages)
                                 .flatMap(Collection::stream)
                                 .distinct()
                                 .filter(x -> !x.equals("Dart"))
                                 .collect(Collectors.toList());
    System.out.println(languages);
  }
}

출력:

Programming languages in the team:
[Java, groovy, go, Python, Javascript]

flatMap 및 기본 유형

Java Stream API는 int, float, long to flat과 같은 기본 데이터 유형에 대해 flatMapto{primitive type}과 같은 별도의 작업도 제공합니다.

import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;

public class SimpleTesting {
  public static void main(String[] args) {
    int[] Je_array = {3, 5, 2, 35, 85, 32, 23, 43, 12};
    Stream<int[]> JE_streamArray = Stream.of(Je_array);
    IntStream JE_intStream = JE_streamArray.flatMapToInt(x -> Arrays.stream(x));
    JE_intStream.forEach(x -> System.out.println(x));
  }
}

출력:

3
5
2
35
85
32
23
43
12

결론

우리는 flatMap() 작업과 그것이 필요한 이유에 대해 논의했습니다. 또한 Java Stream API가 원시 데이터 유형에 대해 별도의 flatMap() 작업을 제공하는 방법에 대해서도 논의했습니다.

일반적인 flatMap() 작업은 기본 데이터 유형에도 적용할 수 있습니다.

관련 문장 - Java Stream