Skip to content

Commit

Permalink
day5
Browse files Browse the repository at this point in the history
  • Loading branch information
HansolJang committed May 5, 2019
1 parent 1ab8c30 commit 69bf838
Showing 1 changed file with 64 additions and 1 deletion.
65 changes: 64 additions & 1 deletion 05-Kotlin/08-highorderfunc.md
Expand Up @@ -103,4 +103,67 @@ fun twoAndThree(operation: (Int, Int) -> Int) {

return { order -> 1.2 * order.itemCount }
}
```
```

### 람다를 활용한 중복 제거

- 웹사이트 방문 기록 분석
- 방문 사이트 경로, 머문 시간, 운영체제
```kotlin
data class SiteVisit(
val path: String,
val duration: Double,
val os: OS
)

enum class OS { WINDOWS, LINUX, MAC, IOS, ANDROID }

val log = listOf(
SiteVisit("/", 34.0, OS.WINDOWS),
SiteVisit("/", 22.0, OS.MAC),
SiteVisit("/login", 12.0, OS.WINDOWS),
SiteVisit("/signup", 8.0, OS.IOS),
SiteVisit("/", 16.3, OS.ANDROID)
)

// 윈도우 사용자의 평균 방문 시간
val averageWindowsDuration = log
.filter { it.os == OS.WINDOWS }
.map(SiteVisit::duration)
.average()
```

- 윈도우 뿐만 아니라 특정 OS 에 대해서 평균 방문 시간을 알고싶다면 ? → 파라미터로 빼자
```kotlin
// 로그 데이터에 대한 확장 함수로 정의
fun List<SiteVisit>.averageDurationFor(os: OS) =
filter { it.os == os }
.map(SiteVisit::duration)
.average()
```

- 모바일(ios, android) 의 평균 머문 시간을 알고 싶다면?
```kotlin
val averageMobileDuration = log
.filter { it.os in setOf(OS.IOS, OS.ANDROID) }
.map(SiteVisit::duration)
.average()
```

→ 재사용하기 힘들다

→ 조건 자체를 함수 타입으로 넘기도록 수정하자
```kotlin
fun List<SiteVisit>.averageDurationFor(predicate: (SiteVisit) -> Boolean) =
filter(predicate)
.map(SiteVisit::duration)
.average()


fun main(args: Array<String>) {
println(log.averageDurationFor {
it.os in setOf(OS.ANDROID, OS.IOS) })
println(log.averageDurationFor {
it.os == OS.IOS && it.path == "/signup" })
}
```

0 comments on commit 69bf838

Please sign in to comment.