Scalaの基本を学ぶ【その2】〜コレクション・リスト・マップ・セットの使い方〜

ScalaのコレクションAPIを徹底解説!List・Map・Setの使い方から、foldLeft・map・filterなどの便利メソッドまで、サンプルコード付きで詳しく解説します。
Scalaの基本を学ぶ【その1】〜制御構文・クラス・オブジェクト・関数〜2024/6/5 23:272025/3/4 0:39

動作環境

Scala:2.12

コレクションライブラリ(immutable と mutable)

Scalaには、一度作成したら変更できない(immutable)なコレクションと変更できる(mutable)通常のコレクションがある。
immutableなコレクションを使うメリット
  1. 関数型プログラミングで多用する再起との相性が良い
  1. 高階関数を用いて簡潔なプログラムを書くことができる
  1. 一度作ったコレクションが知らない箇所で
  1. 並行に動作するプログラムの中で、安全に受け渡しすることができる

Array(mutable)

Arrayの定義例:
 
ここで、の部分は型パラメータと呼ぶ。だけではどの型か分からないので、と付けることでどの型のかを指定している。(しかし、この場面では、の要素型はだとわかっているので、冗長な書き方)
この型パラメータは型推論を補うために、色々な箇所で出てくる。

Range

は範囲を表すオブジェクト
の使用例:

List(immutable)

Scalaではを使うことはそれほど多くなく、といったデータ構造を多用する。の特徴は、一度作成したら中身を変更できない(immutable)であること。中身を変更できないデータ構造(永続データ構造と呼ぶ)はScalaがサポートしている関数型プログラミングにとって重要な要素。
の実行例:
は値を更新することはできないが、その代わりとしてを元に新たなを作ることができる。

Listの先頭に要素をくっつける

(コンスと読む)は既にあるの先頭に要素をくっつけるメソッド
実行例:

List同士の連結

はList同士を連結するメソッド
実行例:
※ 大きな同士を連結する場合、計算量が大きくなるので注意

mkString:文字列のフォーマッティング

mkStringフォーマッティングのやり方は3種類ある。
  • mkString(引数なしバージョン)
※ 引数なしメソッドのを付けて読みだすことができない。逆にを使って定義されたメソッドは、 を付けても付けなくても良いことになっているので注意
  • mkString(sep: String)
  • mkString(start: String, sep: String, end: String)

foldLeft:左からの畳み込み

foldLeftメソッドの宣言:
実行例:
与える引数の順序がちょうど対称となっているメソッドも存在する。

map:各要素を加工した新しいを返す

メソッドは、1引数の関数を引数に取り、各要素に関数を適用した結果で生まれた要素からなる新たなを返す
Listの各要素を2倍したメソッドの実行例:
の部分は、無名関数を定義するための構文。

filter:条件に合った要素だけを抽出した新しいを返す

メソッドは型を返す1引数の関数を引数に取り、各要素に関数を適用し、になった要素のみを抽出した新たなを返す
List内の奇数だけ抽出する実行例:

find:条件に合った最初の要素を返す

メソッドは型を返す1引数の関数を引数に取り、各要素に前から順番に関数を適用し、最初にになった要素をでくるみ、型をして返す。1つの要素もマッチしなかった場合は、型として返す。
List内の最初の奇数だけを抽出する実行例:

takeWhile:先頭から条件を満たしている間を抽出する

メソッドは、型を返す1引数の関数を引数に取り、前から順番に関数を適用し、結果がの間のみからなるを返す
List内の5より前の4要素を抽出する実行例:

count:の中で条件を満たしている要素の数を計算する

メソッドは、型を返す1引数の関数を引数に取り、全ての要素に関数を適用し、が返ってきた要素の数を計算する。
List内の偶数の数を計算する例:

flatMap:を平らにする

メソッドの宣言:
はあらゆるコレクション(要素の型はB型である)を入れることができる型と考える。
の使用例1:使用例1は、ネストしたの各要素にの中でを適用し、の各要素に1を足したものを平らにしている。
の使用例2:使用例2は、の2つのについてループし、各々の要素を掛け合わせた要素からなるを抽出している。

Listの性能特性

  • の先頭要素へのアクセスは高速にできる
  • 要素へのランダムアクセスや末尾へのデータ追加は、の長さに比例した時間がかかってしまう

紹介したメソッドについて

をはじめとしたなどの色々なメソッドを紹介してきたが、これらの大半は、特有ではなく、などの他のコレクションでも同様に使うことができる。その理由は、これらのメソッドによる操作の大半は、コレクションのスーパークラスである共通トレイト中に宣言されているからである。各メソッドの詳細はScalaのAPIドキュメントより。
他のコレクションライブラリについては、以下の公式ドキュメントを参照

Vector(immutable)

は一度データ構造を構築したら変更できないimmutableなデータ構造である。要素へのランダムアクセス・長さの取得・データの挿入や削除などいずれの操作も十分高速にできる。
の使用例:

Map(immutable・mutable)

はキーから値へのマッピングを提供するデータ構造。(他の言語では、辞書や連想配列と呼ばれたりする)Scalaでは、一度作成したら変更できないimmutableなと変更できるmutableなの2種類が提供されている。
Scalaでは、何も設定せずと書いた場合、が使われる。
の使用例:
の使用例:

Set(immutable・mutable)

は値の集合を提供するデータ構造。の中では同じ値が2以上存在しない。(重複した値は自動で削除される)
と同じでScalaでは何も設定せずと書くとが使われる
の使用例:
の使用例:

続きはその3へ!

Scalaの基本を学ぶ【その3】〜ケースクラス・パターンマッチ・エラー処理・Implicitの活用〜2024/6/5 23:272025/3/4 0:44
💡
この記事はこちらのクロスポストです

小幡 十矛(Obata Tomu)|価値を共創するエンジニア
東京を拠点に、アプリ開発・新規事業立ち上げ・ブランドづくりに取り組んでいます。
2021年にサイバーエージェントへ新卒入社後、ABEMA Live や AmebaブログのiOSアプリ開発を担当
現在はフリーランスとして、複数の新規プロダクトやリアル店舗の立ち上げに挑戦中です。
🎯 Mission|人の挑戦を加速する仕組みをつくる ── アイデアを形にし、前に進める“土台”や“場”を共創する
📌 「リアルな場 × デジタル」の可能性を探求し、新しい挑戦が生まれる土壌を育てる
🔹 エンジニアリング × ビジネスの視点から、アイデアを形にし、成長を支えていく
🔹 実店舗オーナーを目指し、オーダースーツ・ドライヘッドスパ・セレクトショップの複合店舗の立ち上げにも挑戦中
👥 特に、社会人1〜5年目くらいで
「やりたい気持ちはあるけど、最初の一歩に迷っている」方へ。 「自分の可能性をもっと広げたい」 「モヤっとしたアイデアがあるけど、どう進めていいかわからない」 そんなフェーズにいる方と、一緒に考えたり、手を動かしたりできたら嬉しいです。
🌱 「挑戦したい20代」との出会いも、大切にしています。 「ちょっと話してみたいな」くらいの気持ちで、気軽に声をかけてもらえたら嬉しいです!🙌
📷 Instagram(リアルイベントや趣味の発信中心): https://www.instagram.com/tomu28creator
🌐 詳しいプロフィールはこちら https://obata-tomu.jp/