[Java8] 스트림(Stream) 중간 연산자

hyozkim·2020년 5월 7일
1

StreamAPI

목록 보기
3/4
post-thumbnail

중간 연산자

1. filter

List<String> names = Arrays.asList("jeong","pro","jdk","java");
Stream<String> a = names.stream().filter(x -> x.contains("o"));

filter는 말 그대로 필터링, 증 조건에 맞는 것만 거른다는 것이다.
위의 코드에서는 람다식을 이용해서 x로 스트림의 요소를 받고 각 요소에 "o"라는 알파벳이 있는 것들만 거른다. 즉, jeongpro만 가지고 있는 스트림을 반환한다.

2. map, flatMap

names.stream().map( x -> x.concat("s") ).forEach(System.out::println);
// mad,play,kim,hyoz  -> mads,plays,kims,hyozs

map은 기존의 데이터에서 수정하여 적용한다는 의미를 가진다.
예를 들어, String형에서 "s"문자열을 끝에 추가하여 리턴한다거나 Int형에서는 값을 x2배 하여 리턴한다거나 다양한 조작이 가능하다.

String[][] namesArray = new String[][] {
                {"kim", "hyoz"}, {"lee", "sooyoung"},
                {"joy", "taehui"}, {"woo", "park"}
        };
        Arrays.stream(namesArray)
                .flatMap(innerArray -> Arrays.stream(innerArray))
                .filter(name -> name.length() <= 3 )
                .collect(Collectors.toList())
                .forEach(System.out::println);
                
// 결과: kim,lee,joy,woo

flatMap은 기존 2차원 이상의 배열을 조작시 쓰인다는 점에서 map과 차이가 있다.
map으로도 2차원 배열 형태의 스트림을 다룰 수 있지만 조금 더 복잡해질 뿐이다.
flatMap은 중첩 구조를 한 단계 제거하고, 단일 컬렉션으로 만들어주는 기능을 수행할 수 있다.

3. skip, peek

IntStream intStream1 = IntStream.of(7,5,5,2,1,2,3,5,4,6);
intStream1
		.skip(2) 
		.peek(s -> System.out.println("skip(2) 실행 후:" + s)) 
        .limit(5)
        .forEach(n -> System.out.println(n)); 
        // 2칸 건너뛰고 5,2,1,2,3 출력됨.

peek() 메소드는 결과 스트림으로부터 요소를 소모하여 추가로 명시된 동작을 수행한다.
주로 결과를 확인하고 싶을때 찍어보는 용도로 사용한다고 한다. (ex. 디버깅용)

4. sorted

System.out.println("sorted: ");
List<String> langs = Arrays.asList("java","kotlin","haskell","ruby","smalltalk");
langs.stream().sorted()
            .forEach(System.out::println);

System.out.println("reversed: ");
langs.stream().sorted(Comparator.reverseOrder())
           .forEach(System.out::println);
                

스트림의 요소들을 정렬하여 새로운 스트림을 생성한다.
sorted()는 param이 없다. 그렇기 때문에 이를 사용하려면 정렬하려는 객체에 Comparable 인터페이스가 구현되어 있어야 사용이 가능합니다. String은 기본적으로 Comparable이 구현되어 있으므로 Comparator.reverseOrder()을 사용하여 역순으로 정렬할 수 있다.

5. distinct

IntStream.of(7,5,5,2,1,2,3,5,4,6).distinct().forEach(System.out::println); // 7,5,2,1,3,4,6

중복이 제거되어 Stream을 반환한다.

6. limit

List<Integer> ages = Arrays.asList(1,2,3,4,5,6,7,8,9);
        ages.stream().limit(3).forEach(System.out::println);
        ages.stream().filter(x -> x>3).limit(3).forEach(System.out::println);

앞선 n개 요소까지 새로운 Stream을 만든다.

7. concat

Stream<String> lang1 = Arrays.asList("JAVA","C++","Python").stream();
Stream<String> lang2 = Arrays.asList("Kotlin","Scala","Javascript").stream();
Stream.concat(lang1,lang2)
            .forEach(System.out::println);

두 Stream을 파라메터 차례로 연결한다.

8. mapToInt, mapToLong, mapToDouble

List<Integer> integerList = Arrays.asList(20,30,50,88,100);
int[] mapToInt = integerList.stream().mapToInt(x->x).toArray(); // Integer -> int(primitive type)

Stream.of("a1","a2","a3")
	.map( s-> s.substring(1) )
        .mapToInt(Integer::parseInt)
        .max()
        .ifPresent(System.out::println); // String -> Int

map과 같은 기능을 가지는데 반환형이 Stream이 아닌 IntStream이라는 점에서 차이가 있다.

profile
차근차근 develog

1개의 댓글

comment-user-thumbnail
2020년 12월 26일

감사합니다람쥐

답글 달기