20200608
코드 먼저
스트림 만들기
스트림을 아무것도 없는 상태에서 만들어 보겠습니다.
맨 처음 timer() 함수처럼 yield를 통해서 Stream에 이벤트를 보내는 법이 있습니다.
timer() 함수는 0 부터 14까지 정수를 스트림에 넣어서 리턴하게 됩니다. 정수 대신 다른 타입으로 바꿔서 적용 가능합니다.
yield 를 사용하려면 async * 를 꼭 붙여줘야 합니다.
timerUser() 함수는 timer() 에서 만든 스트림을 받아서 출력하는 함수 입니다.
줄13 에서 스트림을 받고, 14-17에서 출력합니다. 14번째 줄에 await for 를 확인하세요. await 를 붙여주지 않으면 Iterator가 아니고 Stream이기 때문에 꼭 await 를 붙여주라는 에러가 뜹니다.
특수한 스트림 생성자를 이용해서 스트림을 만드는 방법도 있습니다.
줄20 에서 Stream<int>.periodic(Duration, Function) 함수가 나오는데 이 함수는 Duration 마다 Function 의 결과를 스트림에 보내는 함수입니다. 여기서는 콜백함수로 (x) => x 를 사용했습니다. 여기서 매개변수 x 는 0 부터 시작해서 매 이벤트마다 1씩 증가합니다. 이 함수의 결과로 나오는 스트림은 별도의 지시가 없으면 계속해서 이벤트를 발생시킵니다.
줄21 에서 나오는 forEach(Function) 함수는 지정된 콜백을 매 이벤트마다 실행합니다.
스트림 변환하기
기존 스트림을 변환해서 새로운 스트림을 만드는 방법이 있습니다.
줄20 에서 periodic 으로 나오는 스트림은 계속해서 이벤트가 발생하기 때문에 take(int) 를 이용해서 앞에서 15개만 가지는 새로운 스트림을 만듭니다. 즉, 0에서 14까지의 정수가 스트림에 들어갑니다.
그 뒤로 map, where, expand 같은 함수들이 나옵니다. 이 함수들은 매개변수로 콜백함수를 받습니다.
map은 스트림 이벤트를 콜백을 통해서 일괄 변환시키는 함수.
where는 스트림 이벤트 중에서 콜백의 결과가 true 일때만 새 스트림에 보내는 함수
expand는 map과 비슷하지만 콜백의 리턴 타입이 리스트입니다.