Listͷmapɾfilterͷڍಈ
val list : List = listOf(0, 1, 2, 3)
val converted = list
.filter {
println("filter $it")
it.rem(2) == 0
}
.map {
println("map $it")
it
}
println("--------")
for(it in converted) println("for $it")
Slide 8
Slide 8 text
Listͷmapɾfilterͷڍಈ
filter 0
filter 1
filter 2
filter 3
map 0
map 2
--------
for 0
for 2
Slide 9
Slide 9 text
Listͷmapfilterɺ
શཁૉʹରͯؔ͠Ϧςϥϧ͕ଈ࠲ʹద༻͞Ε·͢
Slide 10
Slide 10 text
࣍Sequence
Slide 11
Slide 11 text
Sequenceͷmapɾfilterͷڍಈ
val sequence : Sequence = sequenceOf(0, 1, 2, 3)
val converted = sequence
.filter {
println("filter $it")
it.rem(2) == 0
}
.map {
println("map $it")
it
}
println("--------")
for(it in converted) println("for $it")
Slide 12
Slide 12 text
--------
filter 0
map 0
for 0
filter 1
filter 2
map 2
for 2
filter 3
List(Iterable)ͷfilterͷ࣮
public inline fun Iterable.filter(predicate: (T) -> Boolean): List {
return filterTo(ArrayList(), predicate)
}
public inline fun > Iterable
.filterTo(destination: C, predicate: (T) -> Boolean): C {
for (element in this)
if (predicate(element))
destination.add(element)
return destination
}
h"ps:/
/github.com/JetBrains/kotlin/blob/v1.1.1/libraries/stdlib/src/generated/_Collec=ons.kt>ΑΓ
Πϯσϯτม͍͑ͯ·͢
Slide 24
Slide 24 text
୯७ɻͦͷ·Μ·
৽ͨͳArrayListΛ࡞ͬͯɺforͯ͠ɺifͯ͠ɺaddͯ͠
Slide 25
Slide 25 text
͡Ό͊ɺSequenceʁ
Slide 26
Slide 26 text
Sequenceͷfilterͷ࣮ʁ
public fun Sequence.filter(predicate: (T) -> Boolean): Sequence {
return FilteringSequence(this, true, predicate)
}
h"ps:/
/github.com/JetBrains/kotlin/blob/v1.1.1/libraries/stdlib/src/generated/_Sequences.kt#L307
Slide 27
Slide 27 text
;Ή;ΉɻͳΔ΄Ͳɻ
FilteringSequenceͷ࣮ʁ
Slide 28
Slide 28 text
FilteringSequenceͷ࣮
internal class FilteringSequence(private val sequence: Sequence,
private val sendWhen: Boolean = true,
private val predicate: (T) -> Boolean
) : Sequence {
override fun iterator(): Iterator = object : Iterator {
val iterator = sequence.iterator()
var nextState: Int = -1 // -1 for unknown, 0 for done, 1 for continue
var nextItem: T? = null
private fun calcNext() {
while (iterator.hasNext()) {
val item = iterator.next()
if (predicate(item) == sendWhen) {
nextItem = item
nextState = 1
return
}
}
nextState = 0
}
override fun next(): T {
if (nextState == -1)
calcNext()
if (nextState == 0)
throw NoSuchElementException()
val result = nextItem
nextItem = null
nextState = -1
return result as T
}
override fun hasNext(): Boolean {
if (nextState == -1)
calcNext()
return nextState == 1
}
}
}
Slide 29
Slide 29 text
͍ʂ
Slide 30
Slide 30 text
IteratorΛ࣮͠ͳ͍ͱ͍͚ͳ͍
͘ͳͬͯ͠·͏
Slide 31
Slide 31 text
େม
Slide 32
Slide 32 text
ࠓͷςʔϚKotlin'1.1
͓ͨͤ͠·ͨ͠
Slide 33
Slide 33 text
Kotlin1.1ͰCorou,neಋೖ
(·ͩexperimental͍͍ͬͯͯΔ͚Ͳʂ)
Slide 34
Slide 34 text
filterͱಉ༷ͷॲཧɺ͏ʑॻ͔ͳ࣮ͯ͘Ͱ͖Δ
Slide 35
Slide 35 text
Corou%neΛͬͯ
SequenceͷfilterΛॻ͘ͱʁ
Slide 36
Slide 36 text
Kotlin'1.1ͰSequenceͷfilter
fun Sequence.where(predicate: (T) -> Boolean): Sequence =
buildSequence {
for (element in iterator()) {
if (predicate(element)) {
yield(element)
}
}
}
Slide 37
Slide 37 text
buildSequenceʂ
ͦͯ͠yieldʂ
Slide 38
Slide 38 text
forͯ͠ifͯ͠
ײతͰ͠ΐʁ
Slide 39
Slide 39 text
Kotlin'1.1ͰSequenceͷfilter
fun Sequence.where(predicate: (T) -> Boolean): Sequence =
buildSequence {
for (element in iterator()) {
if (predicate(element)) {
yield(element)
}
}
}
Slide 40
Slide 40 text
͜ΕͰSequenceΛ؆୯ʹ࡞ΕΔ
Slide 41
Slide 41 text
Generator
ʢͱ͔ݴΘΕͯΔΒ͍͠ʣ
Slide 42
Slide 42 text
buildSequenceͷڍಈΛprintlnͰ
Slide 43
Slide 43 text
val sequence: Sequence = buildSequence {
println("before A")
yield("A")
println("before B")
yield("B")
println("last")
}
println("-----------")
for (element in sequence) {
println("for $element")
}
buffer(count,,skip)
fun Sequence.buffer(count: Int, skip: Int): Sequence> =
buildSequence {
val buffers = LinkedList>()
var i = 0
forEach { element ->
if (i.rem(skip) == 0)
buffers.add(mutableListOf())
for (buffer in buffers)
buffer.add(element)
if (buffers.size > 0 && buffers.peek().count() == count)
yield(buffers.poll().toList())
i++
}
yieldAll(buffers)
}