GWT
data class Car(
val distance: Int,
val name: String){
fun move(): Car{
return this.copy( distance = distance + 1 )
}
}
- val은 불변이 일부만 맞다
* 조작할 수 있는 방법은 추후에.......
- copy를 큰 규모에서 많이 사용되면 문제가 될수 있다. 이걸 해결하고 싶을 땐 tree를 잘 공부해봐~
순수함수
- 중간에 함수의 기능 제외 println 이런것도 포함되면 순수함수가 깨진다.
fun main(){
val list = listOf(1,2,3)
val newList = list + 4
println(newList)
}
불변 프로그래밍을 하고 싶다면..
- Cars(immutable) => Car(immutable) =. Distance(val)
- Cars는 불변이 아니여도 됨. 얘까지 불변이면 어려워
시퀀스
- 매 호출마다 인스턴스를 생성하는게 아니라 흐름으로 본다.
- 필요할 때 계산된다.
data class Crew(
val id: Int,
val missionDone: Boolean
)
fun main(){
val crews = (1..10).map { Crew(it, false) }
val selected = crews
.filter { it.id % 2 == 0 }
.map { it.copy(missionDone = true) }
.take(1)
println(selecte) //의도된 결과가 출력됨
}
- 하지만 이 코드를 돌릴 때 수많은 실행결과가 생성되었다.
- filter,map은 매번 새로운 인스턴스를 생성함
data class Crew(
val id: Int,
val missionDone: Boolean
)
fun main(){
val crews = (1..10).map { Crew(it, false) }
val selected = crews
.asSequence()
.filter { it.id % 2 == 0 }
.map { it.copy(missionDone = true) }
.take(1)
.toList()
println(selecte) //의도된 결과가 출력됨
}
- sequence로 바뀌면 이렇게 된다! GOOD
- 만약 sort가 쓰이면 의미 없어진다.
* WHY?
stateFull VS stateLess
: sort : map, filter
=> Less는 독립적으로 사용가능, 상태가 필요 없음..
=> take()는 less지만 상태를 요구할 수 있음
=> Full은 상당한 양의 상태가 필요하다.
- 만약 sort를 쓰고 싶으면..?
data class Crew(
val id: Int,
val missionDone: Boolean
)
fun main(){
val crews = (1..10).map { Crew(it, false) }
val selected = crews
.sortedByDescending{ it.id }
.asSequence()
.filter { it.id % 2 == 0 }
.map { it.copy(missionDone = true) }
.take(1)
.toList()
println(selecte) //의도된 결과가 출력됨
}
- sequence안에 sort를 하면 mutableList가 생성됨
- 따라서 sequence 전에 sort를 해줘야함
- suffled도 마찬가지....
- 시퀀스 뒤에 sort를 쓰면 변환이 list->sequence->mutableList->sequence->list 이런 식으로 되기 때문에 너무 불필요함