λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Kotlin

Kotlin Collection (1) - (forEach, onEach, filter, filterNot, map, mapNotNull, flatMap, fold, reduce, sum, sumOf)

by 주발2 2025. 2. 9.
λ°˜μ‘ν˜•

μ»¬λ ‰μ…˜ μ²˜λ¦¬λŠ” ꡉμž₯히 λΉˆλ²ˆν•˜κ²Œ μΌμ–΄λ‚˜λŠ” μž‘μ—…μœΌλ‘œ ν‰μ†Œμ— κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” μžλ£Œκ΅¬μ‘°κ°€ μ•„λ‹κΉŒ μ‹ΆμŠ΅λ‹ˆλ‹€.

특히 코틀린을 μ‚¬μš©ν•˜λ©΄μ„œ μžλ°”μ—λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” μœ μš©ν•œ ν•¨μˆ˜λ“€μ΄ λ§Žμ•„μ„œ ꡉμž₯히 잘 ν™œμš©ν•˜κ³  μžˆλŠ”λ°μš”, 이와 κ΄€λ ¨ν•˜μ—¬ 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μ½”ν‹€λ¦° μ»¬λ ‰μ…˜μ— μ‘΄μž¬ν•˜λŠ” μ—¬λŸ¬ ν•¨μˆ˜λ“€μ— λŒ€ν•΄ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

https://www.yes24.com/product/goods/132756874

 

μ½”ν‹€λ¦° 아카데미 : ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° - 예슀24

더 μ‰½κ²Œ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ λ°°μš°λŠ” 방법!이 책은 μ½”ν‹€λ¦°μ˜ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° νŠΉμ§•μ„ 심도 있게 νƒκ΅¬ν•˜λŠ” μ™„λ²½ν•œ κ°€μ΄λ“œμ΄λ‹€. κΈ°λ³Έ κ°œλ…μ„ μ°¨κ·Όμ°¨κ·Ό μ„€λͺ…ν•˜λ©°, μ»¬λ ‰μ…˜ 처리, ν•¨μˆ˜ μ°Έμ‘°, μŠ€μ½”

www.yes24.com

 

πŸ“Ž  Kotlin Collection

1. forEach, onEach, filter, filterNot, map, mapNotNull, flatMap, fold, reduce, sum, sumOf

 


forEach, onEach

forEachλŠ” κ°„λ‹¨ν•œ for문을 λŒ€μ²΄ν•˜λŠ” ν•¨μˆ˜λ‘œ, for 문처럼 λͺ¨λ“  μ›μ†Œμ— λŒ€ν•΄ 연산을 μˆ˜ν–‰ν•©λ‹ˆλ‹€.

forEachλŠ” Unit을 λ°˜ν™˜ν•˜λ―€λ‘œ μ΅œμ’… μ—°μ‚°μž…λ‹ˆλ‹€. μ΄λŠ”, μ»¬λ ‰μ…˜ 처리 νŒŒμ΄ν”„λΌμΈμ—μ„œ forEach μ΄ν›„λ‘œ λ‹€λ₯Έ 연산을 진행할 수 μ—†μŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ μ»¬λ ‰μ…˜ 처리 도쀑 μ›μ†Œ 각각에 λŒ€ν•œ 연산을 μˆ˜ν–‰ν•΄μ•Ό ν•  λ•Œλ„ μžˆλŠ”λ°μš”, μ΄λŸ¬ν•œ 경우 μ›μ†Œλ³„ 연산을 μˆ˜ν–‰ν•œ ν›„ 연산을 마친 μ»¬λ ‰μ…˜μ„ κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•˜λŠ” onEachλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

onEachλŠ” 처음 μ•Œκ²Œ λ˜μ—ˆλŠ”λ°, κ½€λ‚˜ μœ μš©ν•˜κ²Œ ν™œμš©ν•  수 μžˆμ„ 것 κ°™λ„€μš”.

 

 

filter

filterλŠ” ꡉμž₯히 λΉˆλ²ˆν•˜κ²Œ μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜λ‘œ, μ»¬λ ‰μ…˜μ—μ„œ νŠΉμ • μ›μ†Œμ—λ§Œ 관심이 μžˆλŠ” κ²½μš°μ— μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ 전체 μ‚¬μš©μž λͺ©λ‘ 쀑 ν™œμ„± μ‚¬μš©μžλ§Œ 필터링을 ν•˜κ±°λ‚˜, 전체 기사 λͺ©λ‘ 쀑 곡개된 κΈ°μ‚¬λ“€λ§Œ 보여주고 싢은 경우 μ‚¬μš©ν•©λ‹ˆλ‹€.

이럴 λ•Œ predicateλ₯Ό λ§Œμ‘±ν•˜λŠ” μ›μ†Œλ“€μ˜ μ»¬λ ‰μ…˜λ§Œ λ°˜ν™˜ν•˜λŠ” filter λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

filterλŠ” κ±ΈλŸ¬λ‚΄λ‹€ λΌλŠ” 뜻으둜 μ“°μ—¬μ„œ μ²˜μŒμ—λŠ” 필터링이 λ˜λŠ”κ±΄μ§€, ν•„ν„°κ°€ λ˜μ§€ μ•Šκ³  남은 μ›μ†Œλ“€μ„ ν¬ν•¨ν•˜λŠ”κ±΄μ§€ ꡉμž₯히 ν—·κ°ˆλ Έμ—ˆλŠ”λ°, ν”„λ‘œκ·Έλž˜λ°μ—μ„œ filterλŠ” '남아 μžˆλŠ” 것'에 μ΄ˆμ μ„ 두고 생각을 ν•˜λ©΄ λ©λ‹ˆλ‹€.

λ”°λΌμ„œ filter ν•¨μˆ˜λŠ” '...ν•œ μ›μ†Œλ“€μ„ λ‚¨κΈ°λŠ” ν•„ν„°'둜 μ΄ν•΄ν•˜λ©΄ ν—·κ°ˆλ¦¬μ§€ μ•Šκ³  μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

(ν˜Ήμ‹œλ‚˜ ν—·κ°ˆλ¦¬λ”λΌλ„ λ‚΄λΆ€ μ½”λ“œλ₯Ό 보면 λ°”λ‘œ 이해가 κ°€λŠ₯ν•˜κ²Œλ” μ§κ΄€μ μž…λ‹ˆλ‹€.)

 

 

filterNot

filterNot ν•¨μˆ˜λŠ” 넀이밍 κ·ΈλŒ€λ‘œ filter + Not으둜, 'λ§Œμ‘±ν•˜μ§€ μ•ŠλŠ”' μ›μ†Œλ§Œ λ‚¨κΈ°λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

λ”°λΌμ„œ filter { !op(it) } 와 κ°™μŠ΅λ‹ˆλ‹€.

 

 

map

λͺ¨λ“  μ›μ†Œλ₯Ό λ³€ν™˜ν•΄μ£ΌλŠ” map은 개인적으둜 μ»¬λ ‰μ…˜μ—μ„œ κ°€μž₯ 많이 μ‚¬μš©ν•˜λŠ” ν•¨μˆ˜ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

map은 λ™μΌν•œ 크기의 μ»¬λ ‰μ…˜μ„ μƒμ„±ν•˜λŠ”λ°, μ›μ†Œλ“€μ€ λ³€ν™˜λ  수 있고, νƒ€μž… λ˜ν•œ 변경될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

mapNotNull

mapNotNull은 기본적으둜 mapκ³Ό λ™μΌν•˜μ§€λ§Œ null 값을 λ¬΄μ‹œν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μ„±λŠ₯이 μ€‘μš”ν•œ μ½”λ“œμ—μ„œ μ»¬λ ‰μ…˜ 처리λ₯Ό μ΅œμ ν™”ν•  λ•Œ μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, λ¬Έμžμ—΄ 리슀트λ₯Ό 숫자 리슀트둜 λ³€ν™˜ν•˜λ©΄μ„œ μ œλŒ€λ‘œ νŒŒμ‹±λ˜μ§€ μ•ŠλŠ” λ¬Έμžμ—΄μ€ λ¬΄μ‹œν•˜κ³ μž ν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

mapNotNull ν•¨μˆ˜λŠ” 처음 λ΄μ„œ μ‹ κΈ°ν–ˆμ§€λ§Œ, μ‹€μ œλ‘œλ„ ꡉμž₯히 μœ μš©ν•˜κ²Œ μ‚¬μš©ν–ˆλ˜ κ²½ν—˜μ΄ μžˆμ–΄μ„œ 많이 ν™œμš©λ  것 κ°™μŠ΅λ‹ˆλ‹€.

 

 

 

flatMap

flatMap은 μ›μ†Œλ“€μ„ λ‹€λ₯Έ μ»¬λ ‰μ…˜μœΌλ‘œ λ§€ν•‘ν•œ λ‹€μŒ 평탄화(flatten)ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

 

μ΄μ „μ˜ mapκ³Ό 비ꡐ해보면 flatMap은 λ³€ν™˜ κ³Όμ • 쀑간에 리슀트 λ“±μ˜ 순회 κ°€λŠ₯ν•œ μ»¬λ ‰μ…˜μ„ λ°˜ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

 

fold

foldλŠ” μ»¬λ ‰μ…˜ 처리 ν•¨μˆ˜ 쀑 만λŠ₯으둜 μ‚¬μš©ν•  수 μžˆλŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€. μ½”ν‹€λ¦° ν‘œμ€€ λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ£Όμš”ν•œ 연산듀은 λŒ€λΆ€λΆ„ μ œκ³΅ν•˜μ§€λ§Œ λ‹Ήμž₯ μž‘μ—…μ— μ ν•©ν•œ λ©”μ„œλ“œκ°€ 없을 경우 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

foldλŠ” λͺ…μ‹œν•œ 연산을 μˆ˜ν–‰ν•˜μ—¬ λͺ¨λ“  μ›μ†Œλ₯Ό ν•˜λ‚˜μ˜ λ³€μˆ˜λ‘œ μ·¨ν•©ν•˜λŠ” 'λˆ„μ‚°κΈ°'둜 λΆˆλ¦¬λŠ” λ©”μ„œλ“œμž…λ‹ˆλ‹€.

 

μœ„ μ½”λ“œλŠ” μ΄ˆκΈ°κ°’ 0λΆ€ν„° 1μ—μ„œ 4κΉŒμ§€μ˜ 수λ₯Ό λ”ν•˜λŠ” μ½”λ“œλ‘œ λͺ¨λ“  수의 합을 κ³„μ‚°ν•©λ‹ˆλ‹€.

 

μ΄ˆκΈ°κ°’ 섀정에 따라 κ²°κ³Ό νƒ€μž…λ„ λ³€κ²½ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ½”ν‹€λ¦° λΌμ΄λΈŒλŸ¬λ¦¬μ—λŠ” 이미 μˆ˜λ§Žμ€ μ»¬λ ‰μ…˜ 처리λ₯Ό μœ„ν•œ ν•¨μˆ˜λ“€μ΄ 제곡되기 λ•Œλ¬Έμ—, foldλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šλ”λΌλ„ λ§Žμ€ 경우 λ™μΌν•œ 연산을 μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜κ°€ μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ— foldλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” κ²½μš°κ°€ λ§ŽμŠ΅λ‹ˆλ‹€.

 

λ§Œμ•½ fold처럼 μ΅œμ’… 결과뿐 μ•„λ‹ˆλΌ 쀑간 연산값이 ν•„μš”ν•  경우 runningFold λ˜λŠ” scan ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

reduce

reduceλŠ” fold와 λΉ„μŠ·ν•˜κ²Œ λ³€ν™˜ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ λͺ¨λ“  μ›μ†Œλ₯Ό λˆ„μ‚°ν•˜μ§€λ§Œ μ΄ˆκΈ°κ°’μ„ μ •μ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 차이가 μžˆμŠ΅λ‹ˆλ‹€.

μ΄ˆκΈ°κ°’μ„ μ§€μ •ν•˜μ§€ μ•Šκ³  첫 번째 μ›μ†Œλ₯Ό μ΄ˆκΈ°κ°’μœΌλ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

μœ„ κ΅¬ν˜„ μ½”λ“œμ²˜λŸΌ μ»¬λ ‰μ…˜μ΄ λΉ„μ–΄ 있으면 μ˜ˆμ™Έλ₯Ό λ˜μ§€κΈ°μ—, μ»¬λ ‰μ…˜μ— μ›μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μ‹€ν•˜μ§€ μ•Šλ‹€λ©΄ reduceOrNull ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ»¬λ ‰μ…˜μ΄ λΉ„μ–΄μžˆμ„ 경우 null을 λ°˜ν™˜ν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

sum, sumOf

μœ„ fold ν•¨μˆ˜λ₯Ό μ‚΄νŽ΄λ³Ό λ•Œ κ°„λž΅νžˆ λ΄€μ—ˆλŠ”λ°μš”, ν•¨μˆ˜ λ„€μ΄λ°μ—μ„œ μœ μΆ”κ°€ κ°€λŠ₯ν•˜λ“― μ»¬λ ‰μ…˜μ— λ‹΄κΈ΄ 수 λͺ¨λ‘λ₯Ό λ”ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

λ§Œμ•½ μ»¬λ ‰μ…˜μ— λ‹΄κΈ΄ μ›μ†Œλ“€μ˜ ν”„λ‘œνΌν‹° 쀑 ν•˜λ‚˜μ˜ 합을 κ³„μ‚°ν•˜κ³  μ‹Άλ‹€λ©΄, sumOf ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

λ˜ν•œ Int, Long, Double λ“± 숫자λ₯Ό ν‘œν˜„ν•˜λŠ” λͺ¨λ“  νƒ€μž…μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

 

 

μ»¬λ ‰μ…˜μ— μ‘΄μž¬ν•˜λŠ” ν•¨μˆ˜λ“€ 쀑 일뢀에 λŒ€ν•΄ μ‚΄νŽ΄λ³΄μ•˜λŠ”λ°μš”, 이 외에도 ꡉμž₯히 λ§Žμ€ ν•¨μˆ˜λ“€μ΄ 더 μ‘΄μž¬ν•˜κ³  ν¬μŠ€νŒ…μ΄ κΈΈμ–΄μ§ˆ 것 κ°™μ•„μ„œ λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œ 더 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. πŸ™‡‍♂️

 

 

λ°˜μ‘ν˜•

λŒ“κΈ€