2016-07-08 12 views
1

私はScala言語で次のようなことをしています。読みやすくするために._1の使用を避ける方法はありますか?

val newCars = existingCars.filter(_.id > 0).map((_.name, _.plate, _.date)) 
val filteredCars = newCars.filter(_._1 != 0 && _._2.isEmpty && _._3.isEmpty) 

_._1、_._2、_._3を読みにくくする方法はありますか?

次のコードのようなScala言語には何かがありますか?あなたは

newCars.filter { 
    case (id, name, date) => id != 0 && name.isEmpty && date.isEmpty 
} 

一部の機能はまた、あなたのフィルタの外に定義された構成と再利用することができ、部分的な機能を使用することができます

val newCars = existingCars.filter(_.id > 0).map((_.name, _.plate, _.date)) 
val filteredCars = newCars. 
    filter((id, name, date) => id != 0 && name.isEmpty && date.isEmpty) 
+1

'フィルタ(ケース(A、B、C)=> ...)' –

+0

を私は 'マップ((_名、_とは思いません。プレート、_.date)) 'あなたが望むように動作します。 – jwvh

答えて

2

このような特定のフォーマットを使用する場合は、ケースクラスに興味があります。あなたはmapは、3つの機能のタプルを取る必要があり、かつfilter:あなたはすでにそれを知っている場合は、多分あなたは

.map(x=>MyCaseClass.tupled(x)) 
+0

私はスカラーのこの部分が大好きです! – JakeWilson801

0

まず.tupled方法を使用して、タプルから直接それらを構築することができることを知っている必要があり、あなたのコードはコンパイルされません3つのパラメータを持つ関数を取る。 、

existingCars.filter(_.id > 0).filter(car => car.name != 0 && car.plate.isEmpty && car.date.isEmpty).map(car => (car.name, car.plate, car.date)) 

_._1nameに対応しているため(おそらく何かは、あなたの質問に与えられた条件に混同されていない:私は単に最初のフィルタリングをお勧めしたいあなたは、このケースでは

val newCars = existingCars.filter(_.id > 0).map(x => (x.name, x.plate, x.date)) 
val filteredCars = newCars.filter(x => x._1 != 0 && x._2.isEmpty && x._3.isEmpty) 

を意味仮定します〜id)。そして、あなたは2つのfilter Sを簡素化することができます。

existingCars.filter(car => car.id > 0 && car.name != 0 && car.plate.isEmpty && car.date.isEmpty).map(car => (car.name, car.plate, car.date)) 
1

は、他の回答に追加するには、filtermapを組み合わせcollectを使用することもできます。 caseを使用するときは、中括弧{}を使用することを忘れないでください。あなたが何か行うことができ

:。

val newCars = List( 
    ("123ABC", "Chevy", "2016"), 
    ("234BCD","Ford","2016"), 
    ("345DEF","","") 
) 

val filteredCars = newCars.collect{ 
    case (id,name,date) if id.nonEmpty && name.isEmpty && date.isEmpty => 
    (id,name,date) 
} 
関連する問題