한동안 푹쉬었던것 같습니다.
오늘부터는 다시 열공하겠습니다.
Flow는 비동기 Stream입니다.
비동기 Stream이란?
Stream을 설명할때 PIPE라는 말을 하곤합니다.
어떤 값을 파이프 안에 집어넣었는데 안의 연산자(filter,map
같은 중간연산자)으로 인해 값이 바뀌고, 소비자에게 전달되는 구조를 Stream이라고 부릅니다.
Flow는 flow{}
빌더를 이용해 쉽게 만들수 있으며, emit()
를 이용해 데이터를 방출, collect
를 호출하여 값을 받습니다.
여기서 중요할껀 Flow는 콜드스트림이라는건데, collect
를 호출했을때만 값을 방출합니다.
해당 예제를 보면, collect를 할때만 값을 가져오는것을 알수있다.
일반적으로 네트워크 통신을 할때, OKHTTP에 TimeOut를 걸기 때문에, 잘쓰이지는 않을것입니다.
하지만 알고있으면 언젠가 도움이 되겠죠.
Flow는 flow{}
이외에도 flowOf
, asFlow
같은 함수들을 제공해줍니다.
고정된 값을 방출하는 flowOf
는 잘쓰이지 않지만, flow{}
를 통해 flow를 만든다던지, 이미 받은 List를 asFlow
를 이용해 Flow를 만드는 방법은
잘쓰이기 때문에 알아두는것이 좋습니다.
잘 이해가 안되시죠? 쉽게 생각해봅시다.
방금 Flow를 PIPE라고 했습니다.
값을 넣었고, 그대로 Collect한 Consumer에게 결과값을 전달합니다.
그리고 중간 연산자를 통해서 Consumer에게 전달되기전 데이터를 입맛에 맞게 가공할수 있습니다.
map
은 자주 쓰이는 중간 연산자 입니다.
실무에서는 dto가 담긴 클래스를 다른 dto로 변형시키고 싶을때 자주 쓰입니다.
map
을 통해 생성된 객체는, 같은 List라 하여도 계속 새로운 객체로 만들기 때문에 주의합시다!
Filter
는 해당 술어를 통해 만족되는 값을 가공하고, FilterNot
은 반대입니다.
검색기능을 filter
를 통해 쉽게 구현해낼수 있습니다.
중간연산자로 변형하기전의 값이 필요하던지, 두개 이상의 변형된 값이 필요하다면 transform을 고려해봄이 바람직합니다.
reduce는 누진적으로 값을 계산해준다.
만약 1, 2, 3, 4, 5 가 있을때 더해가며 계산하여 3, 6, 10, 15가 발행된다.
count는 종단 연산자이며, 만족하는 자료의 갯수를 리턴해준다.
종단연산의 예로는 collect
가 있는데, 결과를 리턴해주는 역할을 한다.