KOTLIN · 함수형
함수형 파이프라인
데이터 변환을 파이프라인으로 구성하여 선언적으로 처리합니다. 각 단계가 독립적이어서 테스트와 재사용이 용이합니다.
함수형고급pipelinedata-processingdeclarativelet-chain
핵심 설명
데이터 변환을 파이프라인으로 구성하여 선언적으로 처리합니다. 각 단계가 독립적이어서 테스트와 재사용이 용이합니다.
Kotlin code
data class RawRecord(val name: String, val score: String, val dept: String)
data class ValidRecord(val name: String, val score: Int, val dept: String)
data class Report(val dept: String, val avg: Double, val count: Int)
// 파이프라인 단계들 (각각 순수 함수)
val parse: (List<String>) -> List<RawRecord> = { lines ->
lines.map { line ->
val (n, s, d) = line.split(",")
RawRecord(n.trim(), s.trim(), d.trim())
}
}
val validate: (List<RawRecord>) -> List<ValidRecord> = { records ->
records.mapNotNull { r ->
r.score.toIntOrNull()?.let { ValidRecord(r.name, it, r.dept) }
}
}
val aggregate: (List<ValidRecord>) -> List<Report> = { records ->
records.groupBy { it.dept }.map { (dept, recs) ->
Report(dept, recs.map { it.score }.average(), recs.size)
}
}
val format: (List<Report>) -> String = { reports ->
reports.sortedByDescending { it.avg }
.joinToString("
") { "${it.dept}: 평균 %.1f (${it.count}명)".format(it.avg) }
}
fun main() {
val data = listOf("김철수,85,개발", "이영희,92,마케팅", "박지성,88,개발", "최유리,invalid,인사")
// 파이프라인 실행
val result = data.let(parse).let(validate).let(aggregate).let(format)
println(result)
}학습 팁
각 단계를 독립 함수로 분리하면 단위 테스트가 쉽고, 단계를 교체하거나 재배치할 수 있습니다.
주의할 점
파이프라인이 길어지면 중간 타입을 추적하기 어렵습니다. 각 단계의 입출력 타입을 명시적으로 선언하여 가독성을 유지하세요.
자주 묻는 질문
함수형 파이프라인란 무엇인가요?
데이터 변환을 파이프라인으로 구성하여 선언적으로 처리합니다. 각 단계가 독립적이어서 테스트와 재사용이 용이합니다.
함수형 파이프라인 학습 시 주의할 점은 무엇인가요?
파이프라인이 길어지면 중간 타입을 추적하기 어렵습니다. 각 단계의 입출력 타입을 명시적으로 선언하여 가독성을 유지하세요.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.