Convert to Kotlin Hands on

# Introduction
このハンズオンでは、AndroidのサンプルプロジェクトをJavaからKotlinへ変換します。
実際に変換を試してみることで、KotlinでAndroidアプリをどう書けるかというところを体験していただければと思います。

わからなくなった方やプロジェクトがおかしくなった方はサポータに声をかけてください！

---------------------
# Introduction
ハンズオン中の質問は、近くのサポータまたはSli.doに投稿してもらうと拾います。

URL: https://sli.do/

Event code: #R850

---------------------
# Agenda
1. Kotlinとは
1. 本日のアプリ
1. 想定している環境
1. Androidプロジェクトの導入
1. Convert to Kotlin 手順
2. Convert to Kotlin
2. まとめ

---------------------
# Kotlinとは

---------------------
# Kotlinとは
IntelliJ IDEAなどを開発している、JetBrains社が開発したプログラミング言語
静的型付け言語で、様々なプラットフォームで動作する。
Kotlin/JVM、Kotlin/JS、Kotlin/Native

Google I/O 2017でAndroidの公式サポート言語に指定され、最近注目度が上がってきている言語。
また、JavaのWebフレームワークであるSpring5でKotlinがサポートされ、サーバーサイドKotlinも注目されつつある。

---------------------
## 本日のアプリ

---------------------
GithubのAPIにアクセスして言語ごとのレポジトリ一覧を取得し、スター順に一覧表示する。

![device-2018-11-30-103830.png](https://qiita-image-store.s3.amazonaws.com/0/16090/0fc8ecb2-33db-6a4a-cfd9-5402f9b42119.png)

---------------------
# Using App & tools

---------------------
## 想定している環境
- Android Studio  3.2.1
- Java8
- Kotlin 1.3.10
- Kotlin plugin 1.3.10-release-Studio3.2-1

---------------------
## 今日出てくる言語仕様
- valとvar
- NonNullとNullable
- Null安全
- data class
- 拡張関数
- 型推論
- 文字リテラル

---------------------
# Setup the Android project

---------------------
## サンプル
JavaのAndroidプロジェクトを作成しましょう。
サンプルを用意していますので、以下からcloneしてください。

**https://github.com/44x1carbon/kotlin-android-handson.git**

---------------------
# 起動してみましょう

---------------------
# Convert to Kotlin 手順
- Kotlinの設定
- １ファイル毎にKotlin化
- 起動して確認
 
---------------------
## Configure Kotlin
AndroidプロジェクトにKotlinを設定します。

1. Tools -> Kotlin -> Configure Kotlin in project
2. `All modules containing Kotlin files: app`
3. `Kotlin compiler and runtime version: 1.3.10`
4. OK

---------------------
## Java to Kotlin
1. ファイルを右クリック -> Convert Java file to Kotlin file
2. Kotlinらしく修正

---------------------
# Convert to Kotlin

---------------------
## Model

`model.Repository`

- val と var
- nullable
- data class

---------------------
## 変数宣言(val, var)

``` java
// Java
Type obj = new Type();
final Type obj2 = new Type();
```

``` kotlin
// Kotlin
var obj: Type = Type()
val obj2: Type = Type()

// 型推論
val obj2 = Type()
```
---------------------
## Response
`RepositoryEntity`

---------------------
## Response
`SearchResult`

Kotlinファイル を作成してみましょう。

--------------------

``` SearchResult.kt
data class SearchResult (val items: List<RepositoryEntiry>)
```

---------------------
## Api

`SearchRepositoryApi`
`RetrofitSearchRepositoryApi`

- interface 
- 拡張関数
- Lambda式
- classの説明 newいらない

---------------------
# 起動してみましょう

---------------------
## Adapter
`RecyclerAdapter`

- テンプレート文字列
- コンストラクタ
    - val valなし

---------------------
## Fragment

- Companion object
- Null安全
- エルビス演算子
- スコープ関数

---------------------
# 起動してみましょう

---------------------
## Activity
- When式

---------------------
# まとめ

---------------------
## 今日説明していない言語仕様
- 遅延初期化
- コルーチン
- アクセス修飾子
- object
- ラムダ式
- 委譲プロパティ（by）
- 列挙型
- 演算子オーバーロード
 
などなど


---------------------
## Convert to Kotlinしてみていかがでしたでしょうか？

---------------------
## Kotlinまとめ
- KotlinはBetter Java
- Javaとの親和性が高い（100%互換性）
- 文法もJavaと似ているところは多い
- モダンな言語にある機能はだいたいある
- Null安全（ヌルポが起こりにくい）
- 既存クラスを拡張できる
- 簡潔なコードが書ける

---------------------
# Welcome to the Kotlin world :tada:

---------------------
## What's next step?

---------------------

### Kotlin Koans
https://play.kotlinlang.org/koans/overview

<img width="1620" alt="スクリーンショット 2018-11-30 10.32.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/16090/fdc366ee-d534-4971-b960-ea8e7ac9066a.png">

---------------------
### Kotlin公式
https://kotlinlang.org/

<img width="1212" alt="スクリーンショット 2018-11-30 10.35.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/16090/d2cd3f2c-7a03-b2f4-a328-457f588443a1.png">