You will be fine

<Lambda> 5. JAVA8 in Action - Chapter 5

by BFine
반응형

JAVA8 in Action - part2

Chapter 5 - 스트림 활용

5.1.0 필터링과 슬라이싱

  • 데이터를 어떻게 처리할 것인지를 스트림 API가 알아서 처리한다.
  • 필터링의 종류
    • 프리디케이트 : boolean형을 인수로 받아 처리
    • distinct : 중복을 제거
    • limit , skip : 축소, 건너뛰기

5.2.0 매핑

  • mapflatMap 을 통해 특정데이터를 선택 하는 작업을 할 수 있다.

5.2.1 스트림의 각 요소에 함수 적용하기

  • map 은 새로운 버전을 만든다 라는 변환에 가까운 매핑이다.
  • 출력으로 스트림형태 Stream 형식을 가진다.
  • map 은 다른 map 과 연결이 가능하다.

5.2.2 스트림 평면화

  • “hello” , “world” 을 중복없이 쓰인 알파벳을 구하는 예제

    words.stream()
         .map(word->word.split(" "))
         .distinct()
         .collect(toList())
  • 위의 코드의 문제는 Stream이 아닌 Stream<String[]> 을 반환한다.

  • flatMapArrays.stream() 으로 처리할 수 있다. Arrays.stream() 는 문자열을 스트림으로 반환한다.

    words.stream()
         .map(word->word.split(" "))
         .flatMap(Arrays::stream) // 하나의 스트림으로 평면화
         .distinct()
         .collect(toList())
  • flatMap 는 스트림의 각 값을 다른 스트림으로 만들고 모든 스트림을 하나의 스트림으로 연결 하는 기능이다.

  • 아래 코드는 (1,2,3) (3,4)를 각 2개의 쌍으로 만드는 예제이다.

    List<Integer> list = Arrays.asList(1,2,3);
    List<Integer> list2 = Arrays.asList(1,2);
     
    List<Stream<int[]>> res= list.stream()
      .map(i-> list2.stream()
                    .map(j->new int[] {i,j}))
      .collect(Collectors.toList());
      // map일 경우
     
    List<int[]> res2= list.stream()
        .flatMap(i-> list2.stream()
                          .map(j->new int[] {i,j}))
        .collect(Collectors.toList());
      // flatMap일 경우

5.3.0 검색과 매칭

  • 매칭에는 allMatch , anyMatch , noneMatch , findFirst , findAny 가 있다. (boolean 반환)
  • 쇼트서킷이란 원하는 결과를 얻었을때 전체스트림을 처리하지 않아도 반환할 수 있는 것을 말한다.
  • Optional은 값의 존재,부재 여부를 표현하는 컨테이너 클래스이다.
  • 병렬스트림에서 findFirst 는 찾기 어렵기 때문에 순서가 상관없다면 findAny 를 사용한다.

5.4.0 리듀싱

  • 결과가 나올때까지 스트림 모든 요소를 반복적 으로 처리해야 하는 것을 리듀싱 연산이라한다.
  • reduce 는 두개의 인수 초기값과 Operator를 가진다.
  • 초기값이 없는 경우는 Optional객체를 반환한다.
  • reduce 의 장점
    • 내부 구현으로 병렬화 처리를 할 수 있다.
  • sorted 같은 메서드는 과거 이력을 버퍼에 담아야하므로 모든 요소를 버퍼에 추가해야된다.(stateful operation)

5.5 실전 연습

  • 학생 추출해보는 리스트 예제
     //2011년에 일어난 모든 트랜잭션 값을 찾아 오름차순으로 출력
     transactions.stream()
                 .filter(trn-> trn.getYear()==2011)
                 .sorted((x,y)->Integer.compare(x.getValue(),y.getValue()))
                 .forEach(str-> System.out.println(str.toString()));
                 Comparator.comparing(Transaction::getValue);
     
     // 근무하는 도시를 중복없이 출력
     transactions.stream()
                 .map(str->str.getTrander().city)
                 .distinct()
                 .forEach(str-> System.out.println(str));
     
     // 케임브릿지 근무자 찾아 이름순 정렬
     transactions.stream()
                 .filter(str->str.getTrander().city.equals("camb"))
                 .sorted((a,b)->(a.getTrander().name.compareTo(b.getTrander().name)))
                 .forEach(str-> System.out.println(str));
     
     // 밀라노에 거래자 있는지?
     transactions.stream()
                 .anyMatch(tran->tran.getTrander().getCity().equals("mian"));
     
     // 전체 트랜잭션 최솟값
     transactions.stream()
                 .mapToInt(Transaction::getValue)
                 .min()
                 .getAsInt();
     
     transactions.stream()
                 .mapToInt(Transaction::getValue)
                 .reduce(Integer::min)
                 .getAsInt();
     
     transactions.stream()
                 .min(Comparator.comparing(Transaction::getValue))
                 .get()
                 .getValue();
     

5.6.1 기본형 스트림

  • map 으로 스트림을 생성할 경우 sum , min 등은 직접 호출할 수 없다.
  • 그래서 기본형 스트림을 제공한다. IntStream , mapToDouble
  • 기본형 스트림을 다시 스트림으로 바꾸려면 boxed 를 사용하면 된다.

5.6.2 숫자범위

  • range, rangeClosed 지원하고 각각 n제외, n포함이다.

5.7.1 스트림 만들기

  • Stream.of 를 사용하면 값으로 스트림을 만들 수 있다. Stream.empty 로 비울 수 있다.

  • iterator , generate 로 무한스트림을 생성할 수 있다.

  • iterator 는 요청할 떄 마다 값을 생성할 수 있고 언바운드 스트림 이라고 부른다.

  • generate 는 값을 연속적으로 계산하지 않는다. 불변상태 를 유지하고 싶을때 사용한다.(상태저장이 없다)

  • 무한스트림의 요소는 무한적으로 계산이 반복되기 때문에 정렬이나 리듀스 할 수 없다.

  • 피보나치 수열

    Stream.iterate(new int[]{0,1},arr->new int[]{arr[1],arr[0]+arr[1]})
               .limit(10)
               .map(arr->arr[0]) // 각요소 중 첫번째 요소
               .forEach(System.out::println);

출처

  • Java8 in Action


반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기