JetBrains の IDE が全て半額! 急げ!! 当然 Intellij IDEA もだぞ?

急げ! あと数時間しかないぞ!

Don’t miss the JetBrains Friendship Day special offer — all individual tools for developers at 50% off! #JetBrainsFriends

持ってる知り合いを探して、クーポン発行をお願いする、なのか?!

詳細はよう分からんがお得なはず!!


Kotlin で FizzBuzz

考え方や汎用性など落とし所をどうするか。

方針:
- 「15」はコードに入れない。
- 表示処理の分離(MVP)を考慮する。
- 文字列の結合には StringBuilder を使う。


(1..100).map { 

  // P
  StringBuilder().apply {
    if (it % 3 == 0) append("Fizz")
    if (it % 5 == 0) append("Buzz")
    if (isEmpty()) append(it)
  }.toString()

}.forEach {

  // V
  println(it)

}


1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
...

問う側のスペックを問うブーメラン含みな相性判定なんだろうな。

むしろ方針?

👉 Kotlin で FizzBuzz の適当な記述 
あみだくじを罫線で書く
Fizz buzz - Wikipedia


関連ワード:  Android開発


【Android】Kotlin でモダンな concurrency その5

ライフサイクルとコルーチン

Actor は、UI管理にも便利で、タスクのキャンセルをシンプルにし、UIスレッドのオーバーロードを避けることができます。

まず、Activity に適用する JobHolder インターフェースを作成します。これは、セットしたタスクの親となり、それのキャンセルを可能にします。


interface JobHolder {
  val job: Job
}

Activity が destroy されるときに、job.cancel() を行います。


class MyActivity : AppCompatActivity(), JobHolder {

  override val job: Job = Job() // the instance of a Job for this activity

  override fun onDestroy() {
    super.onDestroy()
    job.cancel() // cancel the job when activity is destroyed
  }
}

Extension Function にして、JobHolder の すべての View からアクセス可能にします。


val View.contextJob: Job
  get() = (context as? JobHolder)?.job ?: NonCancellable

これらを組み合わせて、setOnClick に onClick のアクションを管理させるための conflated な Actor を作らせます。複数回の連続クリックは無視され、ANR を避けることができます。

そして、これらのアクションは、contextJob のコンテキストで実行されます。

また、Activity が destroy されるとキャンセルもされます。


fun View.setOnClick(action: suspend () -> Unit) {
  val eventActor = actor<Unit>(
    context = UI,
    start = CoroutineStart.UNDISPATCHED,
    capacity = Channel.CONFLATED,
    parent = contextJob
  ) {
    for (event in channel) action()
  }
  setOnClickListener { eventActor.offer(Unit) }
}

この例では、ここでは多すぎるイベントを無視するために Channel を conflated としてセットしています。すべてをイベントキューとしたい場合は、Channel.UNLIMITED とすることができます。その場合でも ANR は発生しません。

コルーチンとライフサイクルを組み合わせて、UIタスクのキャンセルを自動化することもできます。


val LifecycleOwner.untilDestroy: Job get() {
  val job = Job()

  lifecycle.addObserver(object: LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() { job.cancel() }
  })
  return job
}

// 使い方
launch(UI, parent = untilDestroy) {
  // 何らかの処理
}

【Android】Kotlin でモダンな concurrency その1
【Android】Kotlin でモダンな concurrency その2
【Android】Kotlin でモダンな concurrency その3
【Android】Kotlin でモダンな concurrency その4


関連ワード:  Kotlin開発