すきま風

勉強したことのメモとか

ファーストクラスコレクションにコレクションのメソッドを委譲する

data class Book(
    val title: String,
    val price: Int
)

data class Books(
    private val books: List<Book>
) : List<Book> by books // コレクションメソッドをdelegate

// List<Book> -> Books
fun List<Book>.toValue() = Books(
    map {
        Book(it.title, it.price)
    }
)

fun main() {
    val books = listOf(Book("foo", 1000), Book("bar", 2000)).toValue()

    println(books.isEmpty()) // -> false
    println(books.size)      // -> 2
    println(books[0])        // -> Book(title=foo, price=1000)
}

自分でisEmpty() とか書かなくて良くなるので少し楽になります。
ただ、List実装に強く依存してしまい、公開したくないメソッドまで使えたりするので、その点は微妙かも。