【Scala】Scala ~ 基本編 / 繰り返し ~

■ はじめに

https://dk521123.hatenablog.com/entry/2023/03/12/184331

の続き。

Scala で デフォルトでは、break文がないと知ったので
ループに関して調べてみた

目次

【1】ループ
 1)while文
 2)for文
 3)foreach文
【2】使用上の注意
【3】トラブル
 1)エラー「value foreach is not a member of java.util.List[XXXX]」発生時

【1】ループ

* 注目すべき Java との違いは、for文の構文が変わった

1)while文

* Java と変わらない

2)for文

for(i <- 1 to 3){
  println(i)
}

var array = Array(1, 2, 3)
for (x <- array) {
  println(x)
}

注意点:Javaとの違い

// () -> {} でもOK

object  Hello {
  def main(args: Array[String]): Unit = {
    // for { i <- 1 to 3 }
    for {
      i <- 1 to 3
    } println(s"i = ${i}")
  }
}

for yield

* 以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2023/09/06/232921

3)foreach文

(1 to 3).foreach( i => println(i))

var array = Array(1, 2, 3)
(array).foreach( x => println(x))

【2】使用上の注意

* 冒頭でも書いたが、

[1] break文がデフォルトではない
 => ただし、対応案あり。

[2] continue文もない
 => 完全にない(実装で工夫するしかない)

break / continue については、以下の関連記事で深堀りする

Scala ~ break / continue ~
https://dk521123.hatenablog.com/entry/2023/10/14/011736

[3] Javaコードのコレクション系でのループには
 「 import scala.collection.JavaConversions._」が必要である
 => 詳細は、後述「【3】トラブル」の「1)エラー「・・・」を参照

【3】トラブル

1)エラー「value foreach is not a member of java.util.List[XXXX]」発生時

https://github.com/awsdocs/aws-doc-sdk-examples/blob/main/javav2/example_code/s3/src/main/java/com/example/s3/S3ObjectOperations.java

を参考に Scala コードで書き直していたら、
以下「エラー発生コード」の★の場所で
以下「エラー内容」が表示された

エラー発生コード

// See https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html
val listObjResponse = s3Client.listObjectsV2(listObjectsReqManual)

// See https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/model/S3Object.html
for (content <- listObjResponse.contents()) { // ★ここでエラー★

エラー内容

value foreach is not a member of
 java.util.List[software.amazon.awssdk.services.s3.model.S3Object]

対応案

コードの冒頭に
import scala.collection.JavaConversions._
を付与する

https://github.com/sryza/aas/issues/20

関連記事

Scala ~ 環境構築編 ~
https://dk521123.hatenablog.com/entry/2023/03/10/193805
Scala ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/12/184331
Scala ~ 基本編 / Option型 ~
https://dk521123.hatenablog.com/entry/2023/03/09/000000
Scala ~ 基本編 / メソッド ~
https://dk521123.hatenablog.com/entry/2023/03/03/000000
Scala ~ 基本編 / クラス ~
https://dk521123.hatenablog.com/entry/2023/03/14/000857
Scala ~ 基本編 / コレクション ~
https://dk521123.hatenablog.com/entry/2023/03/13/000345
Scala ~ 基本編 / 日付・日時 ~
https://dk521123.hatenablog.com/entry/2023/03/08/000000
Scala ~ 基本編 / 正規表現
https://dk521123.hatenablog.com/entry/2023/03/18/034704
Scala ~ 基本編 / ジェネリック
https://dk521123.hatenablog.com/entry/2023/03/21/003817
Scala ~ break / continue ~
https://dk521123.hatenablog.com/entry/2023/10/14/011736
Scala ~ for yield ~
https://dk521123.hatenablog.com/entry/2023/09/06/232921
Scala ~ ファイル名・パスの扱い ~
https://dk521123.hatenablog.com/entry/2023/03/11/000000
ScalaYAML
https://dk521123.hatenablog.com/entry/2023/03/16/012034
Spark/Scalaの開発環境構築 ~ Windows編 ~
https://dk521123.hatenablog.com/entry/2023/03/20/115450
SBT ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/03/22/000000