【Kotlin】KotlinにはStream APIが無い?

前回投稿からだいぶ時間が空いてしまいました…。部署異動が原因なのですが、だいぶ忙しくなりました。忙しいですが、異動先が1年前に所属していた部署で知り合いがたくさんいたり、仲の良い同期が同じく異動し一緒に仕事ができたりで、私としては結構楽しく仕事ができています。

さて関係ない話はここまでにして、以下から掲題について書いていきます。ちなみにJavaとの比較なので、Kotlinから学習した方には完全に意味のない記事です。

Stream APIとは?

そこまで詳しく説明はしませんが、Java8から追加されたイテレーター用のAPIです。Stream APIを使うとコレクション(ListとかMapとかSetとか)の集約などの操作がスマート(?)に書けます。

// マップからkeyのみを取得しリスト化する処理の比較
Map<String, String> map = new HashMap<>();
map.put("key1", "hoge");
map.put("key2", "fuga");

// Stream APIを使用しない場合(拡張for文)
List<String> list = new ArrayList<>();
for(Map.Entry<K, V> entry key:map.entrySet()) {
	list.add(entry.getKey());
	// ちなみにvalueを取得したい場合は、entry.getValue()を使用する
}

// Stream APIを使用する場合
List<String> list = map.entrySet().stream().map(entry -> entry.getKey()).collect(Collectors.toList());

上がサンプルコードです。(簡単な例すぎてStream APIの良さが分からないかもしれませんが…)

私としてはコレクションクラスの操作がいい感じに書けるので、めちゃくちゃお気に入りです!!

KotlinにはStream APIが無いみたい

ここからが本題です。私のお気に入りのStream APIがKotlinには存在しないようです。(しっかり調べてないのでどこかで削除されたのか、元々なかったのかは分かりません…)

それではKotlinではコレクションの操作がどうするのか?

心配しなくてもStream APIと同様の機能がkotlin.collectionsに実装されているようです。先ほどのコードをKotlinで記載すると以下のようになります。

val map = mapOf("key1" to "hoge", "key2" to "fuga")
val list = map.map{ map -> map.key }.toList()

Stream APIよりさらに簡潔に記述できるような印象です!ただし、Javaに慣れているせいで間違えることがしばしば…。慣れるしかないですね…。

言語間での記述の違いは難しいですよね。Java, Typescriot, kotlin, python, phpなど色々な言語を扱うようになってだいぶ実感しました。精進します。