HOME > java > java8

Java8의 Stream filter와 Map 사용 방법

JSFollow30 Jun 2018

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

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);

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