자바의 정석 람다와 스트림 학습
메서드 참조(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을 만들 수 있다.
→ 일단 스트림을 만들면 작업을 똑같이 할 수 있다.
-
스트림을 이용한 작업 순서
- 스트림 만들기
- 중간연산(0~n번)
- 최종연산(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)
스트림 만들기_임의의 수
- 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