Movatterモバイル変換


[0]ホーム

URL:


Shinsuke Sugaya, profile picture
Uploaded byShinsuke Sugaya
PDF, PPTX2,092 views

LastaFluteでKotlinをはじめよう

LastaFluteでKotlinを使うための方法を紹介します。

Embed presentation

Download as PDF, PPTX
LastafluteでKotlinをはじめようDBFluteフェス2018 1
DBFluteフェス 2018■ 名前: 菅谷信介■ オープンソース活動:➔ Fess, DBFlute関連, Apache PredictionIO,...■ 2015年からDBFluteフェスのこの枠で...自己紹介2
DBFluteフェス 2018LastaFluteを使っていますか?3
DBFluteフェス 2018Java以外の言語?4
DBFluteフェス 2018LastaFluteでKotlinを使いましょう!5
DBFluteフェス 2018Kotlin入門6
DBFluteフェス 2018■ JetBrains社が作ったJVMで動く静的型付け言語■ 2017年からAndroidの公式開発言語■ Javaと相互運用可能(”100% interoperable”)■ Javaを簡潔/安全になるように改良した言語➔型推論、関数型プログラミング、null安全...etc■ JavaでできることはほとんどKotlinでもできる➔JavaのライブラリはKotlinからも使える➔Javaより簡潔に書けることが多い➔コンパイル時間はJavaと比べて気にならないKotlinとは7
DBFluteフェス 2018■ JetBrains社がJavaからKotlinへの移行を念頭に2011年から開発開始➔2012年 OSS化■ 歴史➔2016年 2月 v1.0➔2017年 3月 v1.1➔2017年 5月 Androidの公式開発言語として採用➔2017年 11月 v1.2➔2018年 10月 v1.3Kotlinの歴史8
DBFluteフェス 2018■ JVM上で動作➔サーバサイドやAndroid■ Kotlin/JS➔KotlinのコードをJSに変換できる■ Kotlin/Native➔Kotlinのコードをネイティブコードに変換できる(LLVM)Kotlinの種類9
DBFluteフェス 2018Kotlinの文法10
DBFluteフェス 2018■ Javaと互換だが、見た目は結構違う(?)➔セミコロンが省略可➔top-level(クラスと同レベル)に関数や変数が宣言できる➔省略表現が豊富➔...etc文法11package project.kotlin // パッケージ名import java.util.* // インポートval PI = 3.14 // 定数class Person constructor(val firstName: String, val lastName: String) {...}fun main(args : Array<String>) {println(“Hello World!”)}
DBFluteフェス 2018■ if-else, try-catch➔Javaのようにも書けるが...文法: if, try12var max: Intif (a > b) {max = a} else {max = b}try {readFile()return true} catch (e: IOException) {e.printStackTrace()return false}
DBFluteフェス 2018■ Kotlinではifやtryは式(expression)➔以下の書き方もできる文法: if, try13val max = if(a > b) a else bval success = try {readFile()true} catch (e: IOException) {false}
DBFluteフェス 2018■ switch文はなく、代わりにwhenを使う➔ifやtryと同様, 式として扱われる➔必要に応じてelseで指定する文法: when14fun isZeroOrOne(x: Int) : String {return when (x) {0 -> "xは0です"1 -> "xは1です"else -> "xは0でも1でもありません"}}print( isZeroOrOne(0) ) // “xは0です”
DBFluteフェス 2018■ for文はforeach方式で書く➔while, do-whileはJavaと同じ文法: for, while15val nameList = listOf(“Taro”, “Hanako”)for (name in nameList) {println(name)}val names = arrayOf("Taro", "Hanako")for(i in names.indices) {println(names[i])}while (x > 0) {x--}
DBFluteフェス 2018■ val(読み取り専用)とvar(可変)➔valはJavaで言うfinalがついた変数➔コンパイラが型推論できる場合は型の宣言は不要■ インスタンスの生成➔newキーワードは不要変数の定義16val name = "Taro"val name : String = “Taro”var str = "text"var str: String = "Text"val sb = StringBuilder("Hello")sb.append(" ").append("World!")print(sb) // Hello World!
DBFluteフェス 2018■ Javaと同じくnullがある■ Optionalのような機能を文法レベルでサポート➔Nullableな変数には”(型名)?"をつける➔Nullableな変数を使うときは■ "?"(nullの時は実行されない)■ "!!"(nullでも強制的に実行)Nullable17var str: String? = nullstr?.length() // strがnullの時実行されないstr!!.length() // strがnullなら当然NullPointerExceptionがthrow
DBFluteフェス 2018■ エルビス演算子 ?:➔左式の評価でnullが発生した場合に右式が評価される■ Smart casts➔型チェックやnullチェックなどをすると暗黙的に安全な型変換をしてくれる機能(コンパイラが追跡できる範囲で)Nullable18var person: Person? = ...val name: String = person?.name ?: "NoName"fun printStringLength(str: String?) {if (str != null) {println(str.length) // strはString?からStringにキャストされる}}
DBFluteフェス 2018■ ==は構造等価性, ===は参照等価性➔Javaのようにequalsメソッドを呼ぶ必要はない➔a == b は “a?.equals(b) ?: (b === null) “と同じ意味➔!=, !==も同様文法: ==と===19val actual = getFirstName()val expected = “Taro”assertTrue(actual == expected)assertTrue(actual !== expected)
DBFluteフェス 2018■ Javaで言うプリミティブ型(int, double, ...)はなく、すべてオブジェクト化(Int, Double...)➔JavaのInteger, Double...に相当■ コンパイラが型推論してくれるので型の宣言は省略できることが多い■ 配列はArray<(型名)>➔Javaの[]に相当➔基本的な型(Int等)には最適化されたArray(intArray等)がある型20val a = arrayOf(1, 2, 3)val b = intArray(1, 2, 3) // 速い
DBFluteフェス 2018■ すべてのクラスのスーパークラス■ Javaで言うObject➔equals(), hashCode(), toString()しか持たないので完全に同じではない■ 任意の型を取る場合は”var any: Any? = null”などとできる特殊な型: Any21
DBFluteフェス 2018■ Javaで言うvoid型■ 返り値がない関数などはUnit型➔省略可特殊な型: Unit22fun printStringLength(str: String?) { // Unit型の関数if (str != null) {println(str.length)}}
DBFluteフェス 2018■ JavaのStringとほとんど同じ➔JavaのString[]はArray<String>➔Javaの標準ライブラリとは別にStringBuilder等もある■ String Template➔$変数名, ${式}で文字列中に値を埋め込めるString23val num = 1print(“num is $num and 2*num is ${2*num}”)val input = readLine(input)print(“the input is $input”)
DBFluteフェス 2018■ コンストラクタはクラス名の後➔セカンダリコンストラクタも作れる➔constructorは省略可■ getter, setterは自動で生成される➔person.firstNameなどで自動でsetter, getterが呼ばれる■ init でコンストラクタに共通処理が書ける■ 継承される可能性があるときはopenを付ける➔何も付けなければfinal class■ interfacesやabstract classは標準でopenとなるクラス24class Person constructor(val firstName: String, var lastName: String) {}val person = Person(“Taro”, “Sato”)
DBFluteフェス 2018■ 生成されるPerson.classをJavaにデコンパイルすると....Javaだと...25public final class Person {@NotNullprivate final String firstName;@NotNullprivate String lastName;@NotNullpublic final String getFirstName() {return this.firstName;}@NotNullpublic final String getLastName() {return this.lastName;}public final void setLastName(@NotNull String string) {Intrinsics.checkParameterIsNotNull((Object)string, (String)"<set-?>");this.lastName = string;}public Person(@NotNull String firstName, @NotNull String lastName) {Intrinsics.checkParameterIsNotNull((Object)firstName, (String)"firstName");Intrinsics.checkParameterIsNotNull((Object)lastName, (String)"lastName");this.firstName = firstName;this.lastName = lastName;}}
DBFluteフェス 2018■ staticな変数や関数のみの集まりを定義したい場合などに使う➔シングルトンの実装などに使えるobject26object HttpClient {var host : Stringinit {host = getHost()}fun httpGetRequest(path: String) : String {return getResponse("GET", host + path)}}print(HttpClient.httpGetRequest("/test/"))
DBFluteフェス 2018■ 各インスタンスで共通のフィールドやメソッドをクラス内で定義したいとき等に使う➔Javaでいうstaticフィールドやstaticメソッド➔top-levelに宣言した方が良い場合もcompanion object27class MyClass{companion object Factory {fun create(): MyClass = MyClass()}}val myClass = MyClass.create()
DBFluteフェス 2018■ データを保持するためのクラス➔コンストラクタ等を書く必要がない■ equals() , hashCode(), toString()などを自動的に生成してくれる➔copy(), componentN()などもData Class28data class User(val name: String, val email: String)val taro = User(name = "Taro", age = 18)
DBFluteフェス 2018■ Javaと同じくジェネリクスをサポート■ Javaとの違い➔変性(<? extends T>的な)はinとoutで書けるGenerics29interface Source<out T> {fun nextT(): T}fun demo(strs: Source<String>) {val objects: Source<Any> = strs}class Box<T>(t: T) {var item = t}val box: Box<Int> = Box<Int>(1)
DBFluteフェス 2018■ ラムダ式は{}で囲む■ ラムダ式の中からアクセスできる➔Javaと違い、値の変更も可ラムダ式30val sum = {x: Int, y: Int -> x + y} // sumの型は "(Int, Int) -> Int"println(sum(1,2)) // sum.invoke(1,2) でもOKvar sum = 0val ints = arrayOf(1, 2, 3)ints.filter { it > 0 }.forEach { sum += it } // ラムダ式の外側の()は省略可println(sum)
DBFluteフェス 2018■ 既存のクラスに対して関数を定義できる➔新しくメソッドを追加するために継承クラスを新しく作る必要がない➔スコープ関数など便利な拡張関数が用意されている拡張関数31class Person constructor(val firstName: String, val lastName: String) {}fun Person.printFullName() {println("${this.firstName} ${this.lastName}")}
DBFluteフェス 2018■ List, Set, Mapなどのコレクションが用意➔基本的にImmutable➔MutableList, MutableSet, MutableMapなどもある➔listOf(), setOf(), mapOf()などインスタンス生成用のメソッドが用意されている➔map, filter, forEachがある(JavaのStream APIと同じ)Collections32val readOnlyList = listOf(1, 2, 3, 4)println(readOnlyList) // "[1, 2, 3, 4]"val hashMap = hashMapOf("r" to 0, "g" to 1, "b" to 2)println(hashMap["g"]) // "1"print( readOnlyList.filter{ it % 2 == 0 } ) // "[2, 4]"hashMap.forEach{ key, value -> print("$key $value") } // "r 0b 2g 1"
DBFluteフェス 2018■ Javaとほぼ同じ(try, catch, finally, throw)➔ただし、Kotlinにはchecked exceptionがないKotlinの例外処理33try {// ...} catch (e: SomeException) {// ...} finally { // 省略可// ...}
DBFluteフェス 2018■ package名を適切に指定すればプロジェクト内で相互に参照可能➔javaとkotlinのディレクトリを作ってコードを管理■ KotlinからJavaを使う場合はそのまま使える■ JavaからKotlinを使う場合はKotlinコードにアノテーション等を付与して調整可能Javaとの相互運用34
DBFluteフェス 2018■ 基本的にJvmアノテーションを付与する■ Jvmアノテーション➔top-levelのクラスやメソッドを使いたい → ファイルの先頭に@JvmName➔クラスのフィールドをつかいたい → @JvmField➔companion objectの中身を使いたい → @JvmStatic➔その他にも@Throwsや@Voaltile等々JavaからKotlinを使う35@file:JvmName("User")...class User {@JvmField val userID = 0companion object {@JvmStaticprivate val EMPTY_INSTANCE = Test()}}
DBFluteフェス 2018LastaFluteで使う36
DBFluteフェス 2018■ IntelliJ➔Kotlinの開発元(JetBrains)のエディタ➔Kotlin用の機能が豊富➔Java → Kotlinのコード変換機能所々自分で修正が必要(他のJavaコードから呼び出されている部分や、実装が入り組んでいる場合は適切に変換されないことが多いので大幅に書き直しが必要なことも)■ Eclipse➔公式のEclipse用のプラグインが提供されている➔でも、IntelliJを使ったほうが良さそう…■ Maven, GradleでもKotlinが使える開発環境37
DBFluteフェス 2018■ Kotlinを利用したLastaFluteのプロジェクト■ Java版のHarborをKotlin化■ Mavenのプロジェクト■ 自動生成されるコードはJavaのまま➔DBFluteの機能はそのまま使える■ Javaプロジェクトからの移行の参考に…https://github.com/lastaflute/lastaflute-example-paradeplazaParadeplaza38
DBFluteフェス 2018Kotlinへの移行39
DBFluteフェス 2018■ JavaとKotlinを共存させる➔変更内容の確認はHarborをdiffすると良い■ kotlin-maven-pluginを追加➔src/main/javaとsrc/main/kotlin■ maven-compiler-pluginを変更■ kotlin-stdlibを依存関係に追加pom.xml40
DBFluteフェス 2018■ Javaのままにしておくもの➔DBFluteで生成するコード➔mylastaに生成されるコード■ 上記以外はIntelliJの変換機能で.ktにするKotlinにするコード41
DBFluteフェス 2018■ 〜Boot.ktのmain関数でJettyBootを起動■ Java的には〜BootKt.classになる➔pom.xmlでmainClassは〜BootKtを指定するJettyBoot42fun main(args: Array<String>) {JettyBoot(8090, "/paradeplaza").asDevelopment(isDevelopment()).bootAwait()}
DBFluteフェス 2018■ @Resourceで指定しているコンポーネント➔Kotlinへの自動変換がうまくいかない■ valになるので、lateint varに変えるDIするコンポーネント43// 自動変換だと以下になる…// @Resource// private val responseManager: ResponseManager? = null@Resourceprivate lateinit var responseManager: ResponseManager
DBFluteフェス 2018■ Nullableの整理が必要■ ラムダの整理が必要➔ たまにラムダの変換が失敗している■ ifなどは式である(return if ….みたいな)■ 定数のconstがなくなる■ StringBuilderをbuildStringにする■ String Templateを使うその他の自動変換問題44
DBFluteフェス 2018■ 書き方は大きくは変わらない実行メソッド45@Executefun index(): HtmlResponse {val recentProducts = mappingToProducts(selectRecentProductList())val highPriceProducts = mappingToProducts(selectHighPriceProductList())return asHtml(ParadeplazaHtmlPath.path_Mypage_MypageHtml).renderWith { data ->data.register("recentProducts", recentProducts)data.register("highPriceProducts", highPriceProducts)}}
DBFluteフェス 2018■ NullableなvarになるFormクラス46class MemberAddForm {@Requiredvar memberName: String? = null@Requiredvar memberAccount: String? = null@ValidateTypeFailure // using calendar so basically unneeded but just in casevar birthdate: LocalDate? = null@Requiredvar memberStatus: CDef.MemberStatus? = null}
DBFluteフェス 2018■ 普通にBhvを使える➔dataクラスにするいいことがあるか(?)DBFlute関連47private fun insertMember(form: MemberAddForm) {val member = Member()member.memberName = form.memberNamemember.memberAccount = form.memberAccountmember.birthdate = form.birthdatemember.memberStatusCodeAsMemberStatus = form.memberStatusif (member.isMemberStatusCodeFormalized) {member.formalizedDatetime = timeManager.currentDateTime()}memberBhv.insert(member)}
DBFluteフェス 2018まとめ48
DBFluteフェス 2018■ LastaFluteでもKotlinを使える➔ DBFlute/LastaFluteの最適化は必要■ Paradeplazaを参考にしてください■ DBFluteの自動生成は利用できる■ 既存プロジェクトでも部分適用も可能まとめ49

Recommended

PDF
Fess/Elasticsearchを使った業務で使える?全文検索への道
PDF
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
PPTX
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
PDF
サイバージェント 秋葉原ラボのHBase 活用事例
PDF
社内ドキュメント検索システム構築のノウハウ
PDF
データマイニング+WEB勉強会資料第6回
PPTX
ウェブから情報をあつめる
PDF
CAジャーナルクラブ Dremel: Interactive Analysis of Web-Scale Datasets
PPTX
BPStudy32 CouchDB 再入門
PDF
[東京] JapanSharePointGroup 勉強会 #2
PDF
Elasticsearchプラグインの作り方
PDF
月間10億pvを支えるmongo db
PDF
Elasticsearch入門 pyfes 201207
PDF
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
KEY
はじめてのCouch db
PPTX
MongoDBが遅いときの切り分け方法
PDF
20181031 springfest spring data geode
PPTX
Reladomo入門 JJUGナイトセミナー #jjug
PPTX
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
PDF
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
PDF
Sc2009autumn s2robot
PDF
chapter6
PDF
Shibuya Perl Mongers#12 No Sql Couch Db
PDF
ARC-009_RDB 技術者のための NoSQL ガイド
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
PPTX
Tokyo Webmining #12 Hapyrus
PPTX
MySQLのインデックス入門
PDF
Kotlinアンチパターン
PDF
From Scala/Clojure to Kotlin

More Related Content

PDF
Fess/Elasticsearchを使った業務で使える?全文検索への道
PDF
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
PPTX
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
PDF
サイバージェント 秋葉原ラボのHBase 活用事例
PDF
社内ドキュメント検索システム構築のノウハウ
PDF
データマイニング+WEB勉強会資料第6回
PPTX
ウェブから情報をあつめる
PDF
CAジャーナルクラブ Dremel: Interactive Analysis of Web-Scale Datasets
Fess/Elasticsearchを使った業務で使える?全文検索への道
LastaFluteに移行したFessとElasticsearch+ESFluteによるDBFlute環境
クローラを作る技術と設計 (毎週のハンズオン勉強会資料)
サイバージェント 秋葉原ラボのHBase 活用事例
社内ドキュメント検索システム構築のノウハウ
データマイニング+WEB勉強会資料第6回
ウェブから情報をあつめる
CAジャーナルクラブ Dremel: Interactive Analysis of Web-Scale Datasets

What's hot

PPTX
BPStudy32 CouchDB 再入門
PDF
[東京] JapanSharePointGroup 勉強会 #2
PDF
Elasticsearchプラグインの作り方
PDF
月間10億pvを支えるmongo db
PDF
Elasticsearch入門 pyfes 201207
PDF
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
KEY
はじめてのCouch db
PPTX
MongoDBが遅いときの切り分け方法
PDF
20181031 springfest spring data geode
PPTX
Reladomo入門 JJUGナイトセミナー #jjug
PPTX
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
PDF
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
PDF
Sc2009autumn s2robot
PDF
chapter6
PDF
Shibuya Perl Mongers#12 No Sql Couch Db
PDF
ARC-009_RDB 技術者のための NoSQL ガイド
PDF
MyNA JPUG study 20160220-postgresql-json-datatype
PPTX
Tokyo Webmining #12 Hapyrus
PPTX
MySQLのインデックス入門
BPStudy32 CouchDB 再入門
[東京] JapanSharePointGroup 勉強会 #2
Elasticsearchプラグインの作り方
月間10億pvを支えるmongo db
Elasticsearch入門 pyfes 201207
MongoDBを用いたソーシャルアプリのログ解析 〜解析基盤構築からフロントUIまで、MongoDBを最大限に活用する〜
はじめてのCouch db
MongoDBが遅いときの切り分け方法
20181031 springfest spring data geode
Reladomo入門 JJUGナイトセミナー #jjug
ウェブアプリのセキュリティをちゃんと知ろう (毎週のハンズオン勉強会の資料)
ふぉとぶらり+LODAC -iPhoneアプリでのSPARQLでの活用事例-
Sc2009autumn s2robot
chapter6
Shibuya Perl Mongers#12 No Sql Couch Db
ARC-009_RDB 技術者のための NoSQL ガイド
MyNA JPUG study 20160220-postgresql-json-datatype
Tokyo Webmining #12 Hapyrus
MySQLのインデックス入門

Similar to LastaFluteでKotlinをはじめよう

PDF
Kotlinアンチパターン
PDF
From Scala/Clojure to Kotlin
PPTX
Java で書かれたAndroid アプリに Kotlin を適用させていく
PPTX
Java で書かれた Android アプリに Kotlin を適用させていく
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
BOF1-Scala02.pdf
PDF
Scalaプログラミング・マニアックス
PPTX
2018/2/20 Kotlin勉強会
PDF
Introduction Xtend
PDF
Object-Funcational Analysis and design
PDF
Kotlin勉強会 in ehime
KEY
JJUG CCC 2012 Real World Groovy/Grails
PPTX
Kotlin
PDF
Kotlin handson
PDF
Scala conf2013
PDF
20170618 Google I/O報告会in福岡
PDF
JavaWorld Day 2009 Scala
PDF
Kotlinの紹介
PPTX
Kotlin が公式サポートになったので Kotlin の話
Kotlinアンチパターン
From Scala/Clojure to Kotlin
Java で書かれたAndroid アプリに Kotlin を適用させていく
Java で書かれた Android アプリに Kotlin を適用させていく
BOF1-Scala02.pdf
BOF1-Scala02.pdf
BOF1-Scala02.pdf
Scalaプログラミング・マニアックス
2018/2/20 Kotlin勉強会
Introduction Xtend
Object-Funcational Analysis and design
Kotlin勉強会 in ehime
JJUG CCC 2012 Real World Groovy/Grails
Kotlin
Kotlin handson
Scala conf2013
20170618 Google I/O報告会in福岡
JavaWorld Day 2009 Scala
Kotlinの紹介
Kotlin が公式サポートになったので Kotlin の話

More from Shinsuke Sugaya

PDF
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
PDF
Elasticsearchで作る形態素解析サーバ
PDF
DBFluteを用いて開発されている全文検索システムFess
PDF
DBFlute Mavenプラグインを用いてCRUD作成
PDF
SolrとElasticsearchを比べてみよう
PDF
ElasticsearchとTasteプラグインで作るレコメンドシステム
PDF
PredictionIOでSparkMLを使った開発方法
PDF
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
PDF
Elasticsearchベースの全文検索システムFess
PDF
オフィスに1台!全文検索Fess
PDF
Elasticsearch Authプラグインでアクセスコントロール
PDF
elasticsearchプラグイン入門
PDF
Solrベースの全文検索サーバ Fess
PDF
PredictionIOのPython対応計画
PDF
PredictionIO構築入門
ESFluteによるElasticsearchでのO/Rマッパーを用いた開発
Elasticsearchで作る形態素解析サーバ
DBFluteを用いて開発されている全文検索システムFess
DBFlute Mavenプラグインを用いてCRUD作成
SolrとElasticsearchを比べてみよう
ElasticsearchとTasteプラグインで作るレコメンドシステム
PredictionIOでSparkMLを使った開発方法
全文検索サーバ Fess 〜 全文検索システム構築時の悩みどころ
Elasticsearchベースの全文検索システムFess
オフィスに1台!全文検索Fess
Elasticsearch Authプラグインでアクセスコントロール
elasticsearchプラグイン入門
Solrベースの全文検索サーバ Fess
PredictionIOのPython対応計画
PredictionIO構築入門

LastaFluteでKotlinをはじめよう


[8]ページ先頭

©2009-2025 Movatter.jp