Java8 Stream의 filter, map, flatMap 사용 방법 및 예제를 소개합니다.
Stream Filter
filter
는 말 그대로 특정조건으로 스트림의 컨텐츠를 필터링하는 것입니다.
사용방법은 함수에 filter(조건)
으로 조건을 넣으시면 됩니다.
아래 코드를 보시면 c
로 시작하는 문자열만 필터링하도록 조건을 설정하였고 이 조건에 해당하는 문자의 stream이 리턴되었습니다.
List<String> list =
Arrays.asList("a1", "a2", "b1", "b2", "c2", "c1", "c3");
Stream<String> stream1 = list.stream();
Stream<String> filtered = stream1.filter(s -> s.startsWith("c"));
filtered.forEach(System.out::println);
결과
c2
c1
c3
Stream Map
필터가 조건을 충족시키는 아이템들만으로 새로운 스트림을 생성한다면, Map
은 각각의 item을 변경하여 새로운 컨텐츠를 생성하는 기능입니다.
필터와 마찬가지로 map(함수)
으로 어떻게 아이템을 변경시킬 지 함수로 정의를 합니다.
아래 코드를 실행하면 모든 문자열이 대문자로 출력이 됩니다. s -> s.toUpperCase()
이 대문자로 변경했기 때문입니다.
List<String> list =
Arrays.asList("a1", "a2", "b1", "b2", "c2", "c1", "c3");
Stream<String> stream2 = list.stream();
stream2.map(s -> s.toUpperCase()).forEach(System.out::println);
결과
A1
A2
B1
B2
C2
C1
C3
정의한 함수 대신에 간단히 String::toUpperCase
를 입력하여 위와 동일한 처리를 할 수 있습니다.
List<String> list =
Arrays.asList("a1", "a2", "b1", "b2", "c2", "c1", "c3");
Stream<String> stream3 = list.stream();
stream3.map(String::toUpperCase).forEach(System.out::println);
Stream FlatMap
FlatMap은 여러개의 스트림을 한개의 스트림으로 합쳐줍니다. 복잡한 스트림을 간단한 스트림으로 변경되는데 사용할 수 있습니다.
예를들어 아래 코드에서는 Stream<String[]>
를 Stream<String>
형태로 변환하였습니다.
플랫맵도 flatMap(함수)
로 정의를 합니다. s -> Arrays.stream(s)
의 의미는 String[] => Stream<String>
과 같아
결국 flatMap(Stream<String>)
과 같은 꼴이네요. 플랫맵은 여러 Stream<String>
객체들을 하나의 스트림 객체로 만들어줍니다.
최종적으로 Stream<String> stream5
객체가 생성되었습니다.
String[][] arrays = new String[][]{ {"a1", "a2"}, {"b1", "b2"}, {"c1", "c2", "c3"} };
Stream<String[]> stream4 = Arrays.stream(arrays);
Stream<String> stream5 = stream4.flatMap(s -> Arrays.stream(s));
stream5.forEach(System.out::println);
결과
a1
a2
b1
b2
c1
c2
c3
FlatMap + Filter + Map
위에서 설명한 기능들을 모두 함께 사용해보았습니다.
String[][] arrays = new String[][]{ {"a1", "a2"}, {"b1", "b2"}, {"c1", "c2", "c3"} };
Stream<String[]> stream6 = Arrays.stream(arrays);
Stream<String> stream7 = stream6.flatMap(s -> Arrays.stream(s));
stream7.filter(s-> s.startsWith("a"))
.map(String::toUpperCase).forEach(System.out::println);
결과
A1
A2
Related Posts
- Java - hashCode(), 사용하는 이유? 구현 방법?
- Java8의 Stream reduce() 사용 방법 및 예제
- Java - filter, map, flatMap 사용 방법 및 예제
- Java - 2개의 Map 합치기 (merge, putAll)
- Java - ConcurrentModificationException 원인 및 해결 방법
- JUnit - @After와 @AfterClass의 차이점
- JUnit - @Before와 @BeforeClass의 차이점
- java와 javac의 차이점
- Java - 자바(JDK) 버전 확인 방법 (터미널, cmd 명령어)
- Java - java.util.Date를 java.sql.Date로 변환
- Java - 시스템 운영체제(OS) 정보 확인
- Java - 코드 실행 시간 측정
- Java - HashSet.retainAll() 사용 방법 및 예제
- Java - ArrayList.retainAll() 사용 방법 및 예제
- Java - ArrayList를 String으로 변환
- Java - float을 int로 변환
- Java - float을 String으로 변환
- Java - String을 boolean으로 변환
- Java - XML을 JSON으로 변환
- Java - ClassNotFoundException 발생 원인 및 해결 방법
- Java - private 생성자를 사용하는 이유
- Java - non-static method cannot be referenced from a static context
- Java - NoSuchMethodError 원인 및 해결 방법
- Java - Object를 byte[]로 변환
- Java - AbstractMethodError 원인 및 해결
- NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper 에러
- Java - HttpClient에 Timeout 적용
- IntelliJ에서 Java 실행 파일 배포 (Export Runnable JAR)
- Java - JAR 디컴파일 방법 (JD-GUI, JD-CLI)
- Java - 키보드, 마우스 이벤트 받기 (이벤트 후킹)
- Java에서 윈도우 cmd 명령어 실행 및 결과 출력
- Java - Selenium 드라이버 자동 설치 방법
- Java - JSON 라이브러리 사용 방법 (JSONObject, JSONArray)
- Java - ZIP 압축, 압축 해제 (zip, unzip)
- Java - byte[] 배열을 File에 저장