Java의 flatMap
-
Java의
flatMap
함수 -
Java에서
flatMap()
메소드를 사용하는 방법 -
Java의
flatMap
에서 중복 제거 -
Java에서
flatMap
요소 필터링 -
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()
작업은 기본 데이터 유형에도 적용할 수 있습니다.