class FunctionStorage {
var myStorageFunction((Int) -> Unit)? = null
inline fun storerFunction(f: (Int) -> Unit) {
myStorageFunction = f // 전달된 파라미터를 저장
}
}
inline fun foo(inline: () -> Unit, noinline NotInLined: () -> Unit) {
/* ... */
}
람다 사용
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
fun main() {
println(people.filter { it.age < 30 })
// [Person(name=Alice, age=29)]
}
직접 기능 구현
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
fun main() {
val result = mutableListOf<Person>()
for (person in people) {
if(person.age > 30) result.add(person)
}
println(result)
// [Person(name=Alice, age=29)]
}
fun main() {
println(
people.filter { it.age > 30 }
.map(Person::name)
)
// [Bob]
}
처리할 원소가 적다면 중간 리스트의 부가 비용이 크지 않다면 원소가 많아질수록 중간 리스트의 부가 비용을 고려해야 함
인라인 키워드를 사용한다고 무조건 성능 개선 효과를 얻는 것은 아님
람다를 인자로 받는 함수만 성능이 좋아질 가능성이 있음
함수의 크기가 큰 경우 인라인이 비효율적일 수 있음
람다로 중복을 없앨 수 있는 일반적인 패턴 중 한가지 → 자원 관리
// 코틀린 라이브러리의 withLock 함수 정의
fun <T> Lock.withLock(action: () -> T): T {
lock()
try {
return action()
} finally {
unlock()
}
}
// withLock 사용 방법
val l: Lock = ReentrantLock()
l.withLock{
// 락에 의해 보호되는 자원 사
}
import java.io.BufferedReader
import java.io.FileReader
fun readFirstLineFromfile(fileName: String): String {
BufferReader(FileReader(fileReader)).use { br ->
return br.readLine()
}
}
import kotlin.io.path.Path
import kotlin.io.path.useLines
fun readFirstLineFromFile(fileName: String): String {
Path(fileName).useLines {
return it.first()
}
}
코틀린에서는 try-with-resources를 사용하지 말라
- try-with-resources → 자바에서 Closeable 자원에 사용할 수 있는 구문
static String readFirstLineFromFile(String fileName) throw IOException { try(BufferfReader br = new BufferdReader(new FileReader(fileName))) { return br.readLine(); } }
- 이 기능을 코틀린에서 use 같은 함수를 통해 간단하게 구현할 수 있음