자바 8 stream flatMap 흐름 의 평면 화 작업 에 대하 여 말씀 드 리 겠 습 니 다.
6628 단어 java8streamflatMap 흐름
Steam 은 자바 8 이 제기 한 새로운 개념 으로 입 출력 의 Stream 흐름 이 아니 라 함수 식 프로 그래 밍 방식 으로 집합 류 에서 복잡 한 조작 을 하 는 도구 입 니 다.한 마디 로 하면 내부 교체 방식 으로 집합 데 이 터 를 처리 하 는 작업 이 고 내부 교 체 는 더 많은 통제 권 을 집합 류 에 맡 길 수 있다.Stream 은 Iterator 와 기능 이 유사 하지만 Iterator 는 외부 교체 형식 으로 집합 데 이 터 를 처리 하 는 작업 입 니 다.
자바 8 이전에 집합 작업 에 대해 처리 과정 을 써 야 합 니 다.예 를 들 어 집합 에서 조건 을 만족 시 키 는 데 이 터 를 선별 하려 면 집합 중의 모든 요 소 를 일일이 옮 겨 다 니 고 모든 요 소 를 조건 에 만족 하 는 지 판단 한 다음 에 조건 을 만족 시 키 는 요 소 를 저장 해 야 합 니 다.한편,Stream 은 집합 선별 작업 에 대해 더욱 편리 한 조작 을 제공 합 니 다.함수 인 터 페 이 스 를 실현 하 는 선별 조건 을 매개 변수 로 전달 하면 Stream 은 스스로 조작 하고 적당 한 요 소 를 stream 방식 으로 되 돌려 주 며 마지막 으로 받 으 면 됩 니 다.
2 가지 조작:
1.intermediate operation 중간 작업:중간 작업 의 결 과 는 하나의 Stream 을 묘사 하고 묘 사 했 으 며 새로운 집합 이 생기 지 않 았 습 니 다.이런 조작 을 타성 구 치 방법 이 라 고도 합 니 다.
2.terminal operation 종료 작업:최종 적 으로 Stream 에서 값 을 얻 을 수 있 습 니 다.
어떻게 이 두 가지 조작 을 구분 합 니까?작업 의 반환 값 유형 에 따라 판단 할 수 있 습 니 다.반환 값 이 Stream 이면 이 작업 은 중간 작업 입 니 다.반환 값 이 다른 값 이거 나 비어 있 으 면 이 작업 은 종료 작업 입 니 다.
flatMap 중간 조작:
Stream 으로 값 을 바 꾸 고 여러 Stream 흐름 을 하나의 Stream 흐름 으로 합 칠 수 있 습 니 다.
한 줄 의 숫자 를 포함 하 는 두 개의 흐름 을 하나의 흐름 으로 합 쳐
@Test
public void flapMapTest() {
List<Integer> list = (List<Integer>) Stream.of(Arrays.asList(1, 2, 3, 4, 5, 6), Arrays.asList(8, 9, 10, 11, 12))
.flatMap(test -> test.stream()).collect(Collectors.toList());
for (int i = 0, length = list.size(); i < length; i++) {
System.out.println(list.get(i));
}
}
flatpap 의 용법 과 의 미 는 하나의 사례 를 통 해 설명 해 야 한다.사례:주어진 단어 목록["Hello","World"]에 대해 목록["H","e","l","o","W","r","d"]을 되 돌려 주 고 싶 습 니 다.
첫 번 째 방식
String[] words = new String[]{"Hello","World"};
List<String[]> a = Arrays.stream(words)
.map(word -> word.split(""))
.distinct()
.collect(toList());
a.forEach(System.out::print);
코드 출력:[Ljava.lang.String;@12edcd21[Ljava.lang.String;@34c45dca
(String[]두 개 를 포함 하 는 list 를 되 돌려 줍 니 다)
이 구현 방식 은 문제 가 있 습 니 다.map 방법 에 전 달 된 lambda 는 단어 마다 String[](String 목록)을 만 들 었 습 니 다.따라서 맵 이 되 돌아 오 는 흐름 은 사실상 Stream
아래 그림 은 위 코드 stream 의 운행 절차 입 니 다.
두 번 째 방식:flatMap(대류 편평 화 처리)
String[] words = new String[]{"Hello","World"};
List<String> a = Arrays.stream(words)
.map(word -> word.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(toList());
a.forEach(System.out::print);
결과 출력:HeloWrdflatMap 방법 을 사용 하 는 효 과 는 각 배열 이 하나의 흐름 을 매 핑 하 는 것 이 아니 라 흐 르 는 내용 을 매 핑 하 는 것 입 니 다.모든 맵(Array:stream)을 사용 할 때 생 성 된 하나의 흐름 이 합 쳐 지 는 것 입 니 다.즉,평면 화 된 것 입 니 다.
아래 그림 은 flatMap 의 stream 운행 절 차 를 활용 하여
예시:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class FlatMap {
public static void main(String[] args) {
//
//
String[] strArray = {"hello", "world"};
//
List<String> res = Arrays.stream(strArray)
.map(w -> w.split(""))
.flatMap(Arrays::stream)
.distinct()
.collect(Collectors.toList());
System.out.println(res);
//TODO
System.out.println("--------------------------------");
//Demo1: , ( )
//[1,2,3,4]=>[1,4,9,16]
Integer[] nums1 = {1, 2, 3, 4};
List<Integer> nums1List = Arrays.asList(nums1);
List<Integer> res1 = nums1List.stream().map(i -> i * i).collect(Collectors.toList());
System.out.println(res1);
System.out.println("--------------------------------");
//Demo2: ,
//[1,2,3],[3,4]=>[1,3],[1,4],[2,3],[2,4],[3,3],[3,4]
Integer[] nums2 = {1, 2, 3};
Integer[] nums3 = {3, 4};
List<Integer> nums2List = Arrays.asList(nums2);
List<Integer> nums3List = Arrays.asList(nums3);
// 2 map
List<int[]> res2 = nums2List.stream().flatMap(i -> nums3List.stream().map(j -> new int[]{i, j})).collect(Collectors.toList());
System.out.println(res2.size());
System.out.println("--------------------------------");
//Demo3: Demo2 Demo1 3
//(2,4) (3,3)
List<int[]> res3 = nums2List.stream().flatMap(i -> nums3List.stream().filter(j -> (i + j) % 3 == 0).map(j -> new int[]{i, j})).collect(Collectors.toList());
System.out.println(res3.size());
}
}
콘 솔 출력 결과:자바 의 스 트림 흐름 중 맵 과 flatMap 의 차이 점
맵 부터 볼 게 요.scala 와 같은 함수 식 언어 를 잘 알 고 있다 면 이 방법 에 대해 잘 알 고 있 을 것 입 니 다.그 역할 은 input Stream 의 모든 요 소 를 output Stream 의 다른 요소 로 비 추 는 것 입 니 다.
대문자 변환
List<String> output = wordList.stream().
map(String::toUpperCase).
collect(Collectors.toList());
이 코드 는 모든 단 어 를 대문자 로 변환 한다.제곱 수
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
List<Integer> squareNums = nums.stream().
map(n -> n * n).
collect(Collectors.toList());
이 코드 는 정수 list 의 제곱 수{1,4,9,16}를 생 성 합 니 다.위의 예 를 통 해 알 수 있 듯 이 맵 은 1:1 맵 을 생 성하 고 모든 입력 요 소 는 규칙 에 따라 다른 요소 로 전환 합 니 다.한 쌍 의 다 중 맵 관 계 를 가 진 장면 도 있 는데 이 때 는 flatMap 이 필요 하 다.
한 쌍 이 많다
Stream<List<Integer>> inputStream = Stream.of(
Arrays.asList(1),
Arrays.asList(2, 3),
Arrays.asList(4, 5, 6)
);
Stream<Integer> outputStream = inputStream.
flatMap((childList) -> childList.stream());
flatMap 은 inpuStream 의 등급 구 조 를 평면 화 하 는 것 은 바로 최 하층 요 소 를 추출 하여 함께 놓 는 것 이다.최종 output 의 새로운 Stream 에는 List 가 없고 모두 직접적인 숫자 이다.이상 의 자바 8 stream flatMap 흐름 의 평면 화 작업 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 실 수 있 고 많은 응원 부 탁 드 리 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Liquibase】DB 작성·테이블 정의 변경신규 스타터 프로젝트 작성 Liquibase와 MySQL 선택 application.properties에 DB 정보 넣기 MySQL에서 "testdatabase"라는 데이터베이스 만들기 빌드 종속성 추가 build....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.