Skip to content

kotlin勉強会 20150605

Takayuki Yorikane edited this page Jun 11, 2015 · 1 revision

かわいいkotlin勉強会

Kotlinらしいコード @ngsw_taro

  • 関数リテラル、高階関数、拡張関数、Delegated Property, Null安全
  1. sum
fun sum(xs: List<Int>): Int {
	var sum = 0
	for (x in ints) {
		sum += x
	}
	return sum
}

var嫌だなー

fun sum(xs: List<Int>): Int {
	@tailRecursive
	fun go(xs: List<Int>, a: Int): Int {
		if(xs.isEmpty())
			return a
		else
			return go(xs.drop(1), a + xs.first())
	}

	return go(xs, 0)
}

末尾呼び出し最適化を有効 ローカル関数 ifでもeleseでもreturn気持ち悪い

	return if(xs.isEmpty()) a
	else go(xs.drop(1), a + xs.first())
fun go(xs: List<Int>, a: Int): Int = 
	if(xs.isEmpty()) a
	else go(xs.drop(1), a + xs.first())

標準API左畳み込みを使えばもっと

fun sum(xs: List<Int>): Int = 
	xs.fold(0) { a, x -> a + x }

拡張関数

fun List<Int>.sum(): Int = 
	fold(0) { a, x -> a + x }

自作しない。標準API

fun Iterable<Int>.sum(): Int
  1. nullable
fun getName(): String?
fun save(s: String): Unit
val name: String? = getName()
if(name != null) {
	save(name)
}
name?.let {
	name -> save(name)
}

標準API let関数 安全呼び出し。nameがnullの場合何もしない。

name?.let {
	save(it)
}

暗黙の変数it

name?.let(::save)

関数参照

  1. immutable
val taro = User.Builder().id(123).name("Taro").build()
val jiro = taro.builder().name("Jiro").build()

fluent interfaceでimmutableなやつ

data class User (
	val id: Long,
	val name: String
)

dataアノテーション プロパティ

val taro = User(id=123, name="Taro")
val jiro = taro.copy(name="Jiro")

dataアノテーションによるcopyメソッド もうLombok系Builderパターン要らない

  1. decorator
class GreetableCharSEq
	(private val cs: CharSequence): CharSequence by cs {
		fun hello() {
			println("Hello, ${cs}")
		}
	}

実際は

fun CharSequence.hello() {
	println("Hello, ${cs}")
}

Server Side Kotlin - Kotlin Webフレームワークの現状 @yy_yank

  • KotlinのWebフレームワーク、JavaのWebフレームワークもKotlinから利用可能

  • Kara, wasabi, Node.kt, Kool, vertx-kotlin

  • 使えるのはKara, wasabi, (Node.kt)

  • Kotlin製Webフレームワークは古いのが多い

  • Node.kt -- ベースはNetty -- wasabiで同等の機能が網羅されている -- 独自のベーシック認証や暗号化復号化機能を持ってるくらい

  • wasabi -- JetBrainsのHadi Haririのプロジェクト -- Http FrameWork -- ベースはNetty -- Interceptorが優秀 -- ModelやViewは含まれず、かなり軽量 -- WebSocketにも対応したっぽい? -- Nettyのアップ/ダウンストリームに合わせてライフサイクルが形成されている

  • Kara -- TinyMissionという会社のWebサービスとモバイル系の会社が開発 -- htmlもcssもロジックもかける -- Jetty + kootstrap(bootstrapのkotlin版)

  • 関数リテラルと相性が良い

  • JavaのWebフレームワークも考える -- MVC1.0(JSR371) --- 辛さがあった -- JAR-RS(JSR339) --- あまりJavaと変わらない -- Spring Boot --- @_siosio_さんがやってた --- 地味に辛さあるけどまぁまぁ --- 辛いのはDI周り

  • Java EEはJavaで使ったほうが良い

  • 使うとしたらSpring Bootかもしれない

  • オレオレWebフレームワーク

  • Karaの低レイヤの部分が参考になりやすいので、それをベースに作ってみるのも良いかも

  • 一番手厚くて今後見込みありそうなのはKara

  • wasabiもすでに完成形なので使えるけどフルスタックというよりは軽量なもの

  • Spring Bootもまぁまぁアリ

  • さらなるKotlinらしさを求めるならプルリクか自作だ

個人開発AndroidアプリをKotlinにガチ移行してみた @kirimin

  • Kotlinならラムダ式もパイプラインでのリスト操作も書ける

  • RxAndroidとも相性が良い

  • 学習コスト低い。静的で安全志向な言語仕様はAndroidエンジニアにちょうどいい

  • Scalaはいろんな意味で人類にはまだ早い

  • Java -> Kotlin -- Null許容型とNull非許容型で型エラーが出てる -- overrideメソッドのsuperでエラーが出てる -- CustomViewのコンストラクタでエラーが出てる --- View()の()を消して、secondary constructorの構文を使おう -- int <-> floatの型変換

  • Javaで設計されたコードの移行はわりと大変だった

  • とはいえ、Kotlinでやること自体は不便さや辛さはほとんど感じなかった

  • 一度Kotlinを味わうとAndroidJavaでリスナやリスト操作を書くのが辛い

Kotlin as an AltJS @mike_neck

  • Java使いにとってのAltJS -- TypeScript, Scala.js, Kotlin

  • Kotlin -- デフォルトでJavaScriptへのコンパイルをサポート -- Java, C#やってれば学習コスト高くない -- 対応しているJSがjQueryしかない

  • Scala.js -- ScalaコンパイラのプラグインでJavaScriptを生成する -- それなりに学習コスト髙い -- sbtというビルドツールが必要。Gradeでも利用可能にするためにMaven artifact化しているらしい

  • TypeScript -- JavaScriptを拡張したAltJS -- 生成JavaScriptはシンプル -- エコシステムが豊富 -- Gradleプラグインある

  • Interoperating with existing JS libraries -- インターフェースを作る必要がある -- native("foo")のような形で既存JSライブラリのインターフェースを準備する

型のティーカップ〜 @_ayato_p

  • Clojure -- Lisp系言語、関数型言語、JVM言語

  • Javaのコード呼び出せる

  • KotlinはJavaのバイトコーををはける

  • ClojureはKotlinのコーを呼び出せる

C#を使ってる人から見たKotlin @RyotaMurohoshi

  • Scalaしてる人はKotlinいらない

  • C#使ってる人はKotlinはいい感じ

  • C#とKotlinにある -- 名前付き引数 - メソッド呼び出しが楽 -- 呼び出し側で渡してるtrueとかfalseが何を指定してるのか分からん -- 呼び出し側で名前月引数を使うと意味が分かる

  • 拡張メソッド -- 既存コードにメソッドを追加 -- 名前空間の下に関数が定義できる

  • thisが無くても拡張関数が呼べる

  • C#7.0はディスカッション中だがKotlinでは既に使える