2

私の意図は単純です: ユーザー オブジェクトのリストから emaild のカンマ区切りの値を取得することです。Java で for ループと if else 条件を使用してこれを行いました。

Scalaでやりたいのでやってみました。

case class User(name: String, email: String)

val userList = List(User("aaa", "aaa@aaa.com"),
                    User("bbb", "bbb@bbb.com"),
                    User("ccc", "ccc@ccc.com"))

val mailIds = userList.foldLeft(""){(a: String, b: User) => ( b.email+","+a) } 

与える

ccc@ccc.com,bbb@bbb.com,aaa@aaa.com,

(最後のコンマに注意してください。)

val mailids = userList.map(x => x.email).reduceLeft(_+","+_)

与える

aaa@aaa.com,bbb@bbb.com,ccc@ccc.com

私はreduceLeftこのようにだけ使ってみました

val emailids = userList.reduceLeft((emails: String, user: User) => emails+", "+user.email)

しかし、それはコンパイルエラーをスローします

type mismatch;  found   : (String, User) => java.lang.String  required: (java.io.Serializable, User) => java.io.Serializable

では、上記の場合になしで使用するより良い方法はありますか?reduceLeftmap

4

2 に答える 2

2

いいえ、アキュムレータがコレクションの最初の要素である場所ですreduceLeftfoldLeftあなたの場合、この最初の要素は aUserであり、反復の次のステップで同じタイプの引数を渡す必要があります。そのため、型の不一致が発生します。
遅延コレクション内でマップを実行し、次のようにこれを減らすことができます。

val mailIds = userList.view map (_.email) reduceLeft (_ + "," + _)

これによりaaa@aaa.com,bbb@bbb.com,ccc@ccc.com、2 番目のコレクションを作成せずに済みます。Jessie Eichar は、そのための非常に優れたチュートリアルを書きました。

編集

遅延コレクションを使用しない方法は、次の方法で最後のコンマを削除することです。

val rawMailIds = userList.foldLeft("")((acc, elem) => acc + elem.email + ",")
val mailIds = rawMailIds.substring(0, rawMailIds.length - 1)
于 2012-05-08T11:32:13.550 に答える
0

map と reduce の組み合わせにこだわってみませんか? いずれにせよ、あなたの問題は、あなたのreduceLeft唯一のバージョンが初期値として文字列を持つ必要があるということです。

于 2012-05-08T11:13:50.717 に答える