Kotlin コレクション　サンプルソース

# Kotlinコレクション

使用頻度の高いコレクションを扱うメソッドをまとめました。

## 使用するデータクラス

### 定義
```kotlin
data class Menu(
    val code: String,
    val type: Int,
    val name: String,
    val price: Int,
    val setMenuCode: List<String>,
    val memo: String?
)
```

### サンプル
```kotlin
    val menus = listOf(
        Menu("1001", 1, "ライス", 300, listOf(), null),
        Menu("1002", 1, "半ラーメン", 400, listOf(), null),
        Menu("1003", 1, "餃子", 500, listOf(), null),
        Menu("1004", 1, "ラーメン", 650, listOf(), null),
        Menu("1005", 1,"チャーハン", 650, listOf(), null),
        Menu("1006", 2, "餃子セット", 750, listOf("1001", "1002", "1003"), null),
        Menu("1007", 2, "チャーハンセット", 950, listOf("1002", "1005",), null),
        Menu("1008", 1, "特製ラーメン", 1000, listOf(), "1日限定20食")
    )
```


## Iterableのメソッド

### 戻り値が条件一致結果

#### filter

```kotlin:サンプルソース
fun trialFilter(menus: List<Menu>) {
    val filteredMenus = menus.filter {
        800 < it.price
    }
    println(filteredMenus)
}
```

```console:結果
[Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null), Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食)]
```

#### filterNot

```kotlin:サンプルソース
fun trialFilterNot(menus: List<Menu>) {
    val filteredMenus = menus.filterNot {
        600 < it.price
    }
    println(filteredMenus)
}
```

```console:結果
[Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null), Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null)]
```

#### find

```kotlin:サンプルソース
fun trialFind(menus: List<Menu>) {
    val foundMenus = menus.find {
        it.price == 650
    }
    println(foundMenus)
}
```

```console:結果
Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null)
```

#### findLast

```kotlin:サンプルソース
fun trialFindLast(menus: List<Menu>) {
    val foundMenus = menus.findLast {
        it.price == 650
    }
    println(foundMenus)
}
```

```console:結果
Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null)
```

#### first

```kotlin:サンプルソース
fun trialFirst(menus: List<Menu>) {
    val first = menus.first()
    println(first)
    val first2 = menus.first {it.price == 650 }
    println(first2)
}
```

```console:結果
Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null)
Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null)
```

#### firstOrNull

```kotlin:サンプルソース
fun trialFirstOrNull(menus: List<Menu>) {
    val first = menus.firstOrNull()
    println(first)
    val first2 = menus.firstOrNull {it.price == 1200 }
    println(first2)
}
```

```console:結果
Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null)
null
```

#### singleOrNull

```kotlin:サンプルソース
fun trialSingleOrNull(menus: List<Menu>) {
    val list1 = listOf(
        menus.elementAt(0)
    )
    val list2 = listOf(
        menus.elementAt(0),
        menus.elementAt(1)
    )
    println(list1.singleOrNull())
    println(list2.singleOrNull { it == menus.elementAt(1) })
    println(list2.singleOrNull { it == menus.elementAt(2) })
    println(list2.singleOrNull())
}
```

```console:結果
menus.singleOrNull
Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null)
Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null)
null
null
```

### 各要素を処理

#### forEach

```kotlin:サンプルソース
fun trialForEach(menus: List<Menu>) {
    menus.forEach {
        print(it.code + ",")
    }
    println()
}
```

```console:結果
1001,1002,1003,1004,1005,1006,1007,1008,
```

### 戻り値がコレクション型

#### map

```kotlin:サンプルソース
fun trialMap(menus: List<Menu>) {
    val map = menus.map { it.code to it }
    println(map)
    val list = menus.map { it.code }
    println(list)
    val set = menus.map { it.code }.toSet()
    println(set)
}
```

```console:結果
[(1001, Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null)), (1002, Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null)), (1003, Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null)), (1004, Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null)), (1005, Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null)), (1006, Menu(code=1006, type=2, name=餃子セット, price=750, setMenuCode=[1001, 1002, 1003], memo=null)), (1007, Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null)), (1008, Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食))]
[1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008]
[1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008]
```

#### flatMap

```kotlin:サンプルソース
fun trialFlatMap(menus: List<Menu>) {
    val list = menus.map { menu ->
        menu.setMenuCode
    }
    println(list)
    val list2 = menus.flatMap { menu ->
        menu.setMenuCode
    }
    println(list2)
}
```

```console:結果
[[], [], [], [], [], [1001, 1002, 1003], [1002, 1005], []]
[1001, 1002, 1003, 1002, 1005]
```

#### flatten

```kotlin:サンプルソース
fun trialFlatten(menus: List<Menu>) {
    val preList = listOf(
        listOf(
            menus.elementAt(0),
            menus.elementAt(1)
        ),
        listOf(
            menus.elementAt(2),
            menus.elementAt(3)
        )
    )
    println(preList)
    val list = preList.flatten()
    println(list)
}
```

```console:結果
[[Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null)], [Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null), Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null)]]
[Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null), Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null), Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null)]
```

### 戻り値が可変コレクション型

#### mutableListOf

```kotlin:サンプルソース
fun trialMutableList(menus: List<Menu>) {
    val mutableList = mutableListOf(menus)
    mutableList.add(
        mutableListOf(
            Menu("1009", 1, "タンメン", 750, listOf(), null)
        )
    )
    println(mutableList)
}
```

```console:結果
[[Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null), Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null), Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null), Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null), Menu(code=1006, type=2, name=餃子セット, price=750, setMenuCode=[1001, 1002, 1003], memo=null), Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null), Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食)], [Menu(code=1009, type=1, name=タンメン, price=750, setMenuCode=[], memo=null)]]
```

#### associate

```kotlin:サンプルソース
fun trialAssociate(menus: List<Menu>) {
    val map = menus.associate {
        it.code to it
    }
    println(map)
}
```

```console:結果
{1001=Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), 1002=Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null), 1003=Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null), 1004=Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null), 1005=Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null), 1006=Menu(code=1006, type=2, name=餃子セット, price=750, setMenuCode=[1001, 1002, 1003], memo=null), 1007=Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null), 1008=Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食)}
```

#### filterNot

```kotlin:サンプルソース
fun trialAssociateBy(menus: List<Menu>) {
    val map = menus.associateBy {
        it.code
    }
    println(map)
}
```

```console:結果
{1001=Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), 1002=Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null), 1003=Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null), 1004=Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null), 1005=Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null), 1006=Menu(code=1006, type=2, name=餃子セット, price=750, setMenuCode=[1001, 1002, 1003], memo=null), 1007=Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null), 1008=Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食)}
```

### 戻り値がList型

#### trialDistinct

```kotlin:サンプルソース
fun trialDistinct(menus: List<Menu>) {
    val distinctPriceList = menus.map {
        it.price
    }.distinct()
    println(distinctPriceList)
}
```

```console:結果
[300, 400, 500, 650, 750, 950, 1000]
```

### 戻り値がBoolean型

#### any

```kotlin:サンプルソース
fun trialAny(menus: List<Menu>) {
    println(menus.any {  999 < it.price })
    println(menus.any {  1000 < it.price })
}
```

```console:結果
true
false
```

#### contains

```kotlin:サンプルソース
fun trialContains(menus: List<Menu>) {
    val ramenList = listOf("醤油ラーメン", "特製ラーメン")
    val list = menus.filter {
        ramenList.contains(it.name)
    }
    println(list)
}
```

```console:結果
[Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食)]
```

### 戻り値が計算結果

#### fold

```kotlin:サンプルソース
fun trialFold(menus: List<Menu>) {
    val total = menus.fold(80000) { sum, menu ->
        sum + menu.price
    }
    println(total)
}
```

```console:結果
85200
```

### 戻り値が振り分け結果

#### groupBy

```kotlin:サンプルソース
fun trialGroupBy(menus: List<Menu>) {
    println("======================================")
    println("menus.groupBy")
    val map = menus.groupBy {
        it.type
    }
    println(map)
}
```

```console:結果
{1=[Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null), Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null), Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null), Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null), Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食)], 2=[Menu(code=1006, type=2, name=餃子セット, price=750, setMenuCode=[1001, 1002, 1003], memo=null), Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null)]}
```

### 戻り値が文字列

#### joinToString

```kotlin:サンプルソース
fun trialJoinToString(menus: List<Menu>) {
    val str = menus.joinToString(
        separator = ",",
        prefix = "{",
        postfix = "}"
    )
    println(str)
}
```

```console:結果
{Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null),Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null),Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null),Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null),Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null),Menu(code=1006, type=2, name=餃子セット, price=750, setMenuCode=[1001, 1002, 1003], memo=null),Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null),Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食)}
```

### 戻り値が並べ替えの結果

#### sortedBy

```kotlin:サンプルソース
fun trialSortedBy(menus: List<Menu>) {
    println(menus.sortedBy { it.type })
}
```

```console:結果
[Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null), Menu(code=1002, type=1, name=半ラーメン, price=400, setMenuCode=[], memo=null), Menu(code=1003, type=1, name=餃子, price=500, setMenuCode=[], memo=null), Menu(code=1004, type=1, name=ラーメン, price=650, setMenuCode=[], memo=null), Menu(code=1005, type=1, name=チャーハン, price=650, setMenuCode=[], memo=null), Menu(code=1008, type=1, name=特製ラーメン, price=1000, setMenuCode=[], memo=1日限定20食), Menu(code=1006, type=2, name=餃子セット, price=750, setMenuCode=[1001, 1002, 1003], memo=null), Menu(code=1007, type=2, name=チャーハンセット, price=950, setMenuCode=[1002, 1005], memo=null)]
```

## Collectionのメソッド

### 戻り値がBoolean型

#### isEmpty

```kotlin:サンプルソース
fun trialIsEmpty(menus: List<Menu>) {
    println(menus.isEmpty())
    println(listOf<Menu>().isEmpty())
}
```

```console:結果
false
true
```

## Listのメソッド

### 戻り値がコレクション型

#### getOrNull

```kotlin:サンプルソース
fun trialGetOrNull(menus: List<Menu>) {
    println(menus.getOrNull(0))
    println(menus.getOrNull(10))
}
```

```console:結果
Menu(code=1001, type=1, name=ライス, price=300, setMenuCode=[], memo=null)
null
```