[TIL] 1월 19일

yeon·2021년 1월 19일
1

자바의 정석 람다와 스트림 학습

메서드 참조(812p)

  • 람다식을 간단히 표현한 것
  • 클래스이름 :: 메서드 이름 또는 참조변수 :: 메서드 이름
import java.util.function.Function;

public class Ex14_0 {
    public static void main(String[] args) {
        // 람다식
        Function<String, Integer> f1 = s -> Integer.parseInt(s);
        // 위의 람다식을 메서드 참조로 바꾸면
        Function<String,Integer> f2 = Integer::parseInt; 
    }
}

스트림(814p)

  • 다양한 데이터소스를 표준화된 방법으로 다루기 위한 것

  • 기존에는 Collection Framework 를 이용하여 데이터소스들을 다뤘는데 사용방법이 다 달랐다. stream의 사용으로 이를 통일 시켰다.

  • 데이터소스(배열, 컬렉션 List, Set, Map)로 부터 stream을 만들 수 있다.

    → 일단 스트림을 만들면 작업을 똑같이 할 수 있다.

  • 스트림을 이용한 작업 순서

    1. 스트림 만들기
    2. 중간연산(0~n번)
    3. 최종연산(0~1번)

스트림의 특징

  • 스트림은 데이터 소스로부터 데이터를 읽기만하고 데이터 소스를 변경하지 않는다.
  • 스트림은 일회용이다. 한번 닫히면 다시 사용할 수 없고, 필요하면 다시 생성해서 사용해야 한다.
  • 스트림은 작업을 내부 반복으로 처리한다.
    • 반복문을 메서드의 내부에 숨길 수 있다는 의미
    • forEach()는 메서드 안으로 for문을 넣은 것이다.
    • 성능은 비효율적이지만 코드가 간결해진다.
  • 지연된 연산
    • 최종 연산이 수행되기 전까지는 중간 연산이 수행되지 않는다.
    • 중간 연산을 호출하는 것은 단지 어떤 작업이 수행되어야하는지 지정해주는 것
    • 최종 연산이 수행되어야 그때 스트럼의 요소들이 중간연산을 거치고, 최종 연산에서 소모된다.
  • 기본형 스트림 - IntStream, LongStream, DoubleStream
    • 오토박싱, 언박싱으로 인한 비효율을 줄임
    • Stream 대신 IntStream 을 사용하는 것이 더 효율적
    • 숫자와 관련된 유용한 메서드를 Stream보다 기본형 스트림이 더 많이 제공한다.
  • 병렬 처리가 쉽다. - 병렬 스트림
    • 병렬 스트림은 내부적으로 자동적으로 연산을 병렬로 수행한다.
    • 스트림에 parallel() 이라는 메서드 호출하면 스트림이 병렬 스트림으로 전환된다.

스트림 연산

  • 스트림이 제공하는 다양한 연산을 이용할 수 있다.
  • 중간 연산 : 연산결과가 스트림, 연속해서 중간 연산 할 수 있음 (0~n번)
  • 최종 연산 : 연산 결과가 스트림이 아닌 연산, 스트림의 요소를 소모하므로 한번만 가능 (0~1번)
  • 모든 중간 연산의 결과는 스트림이지만, 연산 전의 스트림과 같은 것은 아니다.

스트림 만들기_특정 범위의 정수 (819p)

지정된 범위의 연속된 정수를 스트림으로 생성해서 반환한다.

  • range(int begin, int end)
  • rangeClosed(int begin, int end)
    • end를 포함

스트림 만들기_임의의 수

  • ints(), longs(), doubles()
    • 각 타입의 난수들로 이루어진 스트림을 반환
    • 무한 스트림이여서 limit()을 이용해서 유한스트림으로 만들어 줘야 한다.
    • ints(), longs(), doubles()의 매개변수로 스트림의 크기를 지정해서 유한 스트림을 생성해서 반환할 수도 있다.

람다식-iterate(), generate() (821p)

  • 이들은 람다식을 매개변수로 받는다.
  • 람다식에 의해 계산되는 값들을 갖는 무한 스트림 생성
  • iterate(T seed, UnaryOperator f)
    • seed는 초기값
    • seed로 지정된 값부터 시작해서, 람다식 f에 의해 계산된 결과를 다시 seed로 받아서 계산을 반복한다.
    • 이전 요소에 종속적
  • generate(Supplier s)
    • s는 Supplier 타입이기 때문에 입력값은 없고, 출력값만 있는 람다식만 허용
    • 초기값을 사용하지 않는다.
    • 이전 요소에 독립적이다.
  • iterate()와 generate()에 의해 생성된 스트림은 기본형 스트림 타입의 참조변수로 다룰 수 없다.
    • 필요시, mapToInt()와 같은 메서드로 변환해야 한다.

오늘 한 일

  • 메서드 참조란?, 스트림이란?, 스트림의 특징, 스트림을 이용한 작업 순서, 스트림이 제공하는 연산, 특정범위의 정수를 스트림으로 생성하는 법, 임의의수를 스트림으로 생성하는 법, 람다식을 매개변수로 받아서 스트림을 생성하는 iterate()와 generate()
    • 익숙하지 않은 수많은 내용을 이틀만에 이해하려니 이해가 잘 안되는 부분이 있다.
    • 지금은 이해가 안가도 나중에 또 보면 이해가 가겠지.. 라는 마음으로 학습했다.

Todo

  • 컬렉션 프레임웍 학습하기
  • 학습정리 내용 학습하기 (수요일 알고리즘 조금만 풀고)
  • 지네릭스 학습하기 (수요일 알고리즘 조금만 풀고)

Reminder

  • 영어로 구글링해서 영문자료 자주 읽어보기

0개의 댓글