이번 로또 미션을 진행하면서 받았던 피드백을 기반으로 학습로그를 작성해본다.
우선 이번 피드백을 통해 새로 배웠던 것들을 중심으로 삼는다.
1. stream 함수 활용
2. associateWith 사용
이렇게 2가지가 있다.
map()
: 컬렉션 내 인자를 다른 값 or 타입으로 변환할 때 사용mapIndexed()
: 컬렉션 내 포함된 인자의 인덱스 값을 변환 함수 내에서 사용할 떄 사용groupBy()
: 컬렉션 내 인자들을 지정한 기준에 따라 분류하여 맵 형태로 결과 반환filter()
: 컬렉션 내 인자들 중 주어진 조건과 일치하는 인자만 걸러주는 역할take()
: 컬렉션 내 인자들 중 앞에서 take() 함수의 인자로 받은 개수만큼만을 인자로 갖는 리스트 반환takeLast()
: take() 함수와 반대로 뒤에서부터 적용해 반환takeWhile()
: 첫 번째 인자부터 시작하여 주어진 조건을 만족하는 인자까지를 포함하는 리스트를 반환drop()
: take() 함수의 반대 역할. 조건을 만족하는 항목을 컬렉션에서 제외한 결과를 반환distinct()
: 컬렉션 내에 포함된 항목 중 중복된 항목을 걸러낸 결과 반환 (equlas로 판단)zip()
: 컬렉션 내의 자료들을 조합해 새로운 자료를 만들 때 사용. 기본 값으로는 조합된 결과를 Pair로 만듦.count()
: 컬렉션 내 포함된 자료의 개수 반환이랬던 코드가
val randomNumbers = (LottoNumber.getMinNumber()..LottoNumber.getMaxNumber()).shuffled().subList(LOTTO_MIN_SIZE, LOTTO_LIMIT_SIZE).sorted()
이렇게 변했다.
val randomNumbers = (LottoNumber.getMinNumber()..LottoNumber.getMaxNumber()).shuffled().take(LOTTO_SIZE).sorted()
associateWhth()
: List를 전체 탐색하면서 List의 인자를 key로, 매개변수로 받은 valueSelector를 value로 설정해 Map<key, value>로 리턴함.이랬던 내 코드가
var result = mutableMapOf(
Rank.FIFTH to 0,
Rank.FOURTH to 0,
Rank.THIRD to 0,
Rank.SECOND to 0,
Rank.FIRST to 0
)
이렇게 이쁘게 바뀌었다.
val winningResult = Rank.values().associateWith {
rank ->
lottos.count { rank == it.matchLotto(winningNumber.lotto, winningNumber.bonusNumber) }
}