2

リスト (またはマップ内の値) があり、各アイテムに対して操作を実行したいとします。残念ながら、何らかの理由で、この値のリストには null が含まれる可能性があります。

scala> val players = List("Messi", null, "Xavi", "Iniesta", null)
players: List[java.lang.String] = List(Messi, null, Xavi, Iniesta, null)

NPE で爆発しないようにするには、次のことを行う必要があります。

scala> players.filterNot(_ == null ).map(_.toUpperCase)
res84: List[java.lang.String] = List(MESSI, XAVI, INIESTA)

これを行うより良い方法はありますか?

理想的には次のようなものです:

players.safeMap(_.toUpperCase)

scala-language メーリング リストで、Simon は次のように提案しました。

players.filter ( null !=).map(_.toUpperCase )

これは私のオリジナル テイクの短いバージョンであり、専用の方法を使わずにできる限り短いものです。

さらに良いことに、Stefan と Kevin は遅延プロキシを返すメソッド withFilter を提案したので、両方の操作をマージできます。

players.withFilter ( null !=).map(_.toUpperCase )
4

3 に答える 3

3

sを避けることができない場合null(たとえば、Java コードからリストを取得する場合)、collect代わりにを使用することもできますmap:

scala> players.collect { case player if player != null => player.toUpperCase }
res0: List[java.lang.String] = List(MESSI, XAVI, INIESTA)
于 2012-04-26T21:08:08.260 に答える
2

私はこれをします:

players flatMap Option map (_.toUpperCase)

しかし、それはより悪いですcollectfilter+mapは常に を使用した方が適切collectです。

于 2012-04-27T00:25:21.507 に答える
1

次のリストに変換できますOption[String]

scala> val optionPlayers = players.map(Option(_))
optionPlayers: List[Option[java.lang.String]] = List(Some(Messi), None, Some(Xavi), Some(Iniesta), None)

Optionは一般的に好まれてnullおり、データを安全に処理する方法に多くの柔軟性をもたらします。探していた結果を得る簡単な方法は次のとおりです。

scala> optionPlayers.collect { case Some(s) => s.toUpperCase }
res0: List[java.lang.String] = List(MESSI, XAVI, INIESTA)

scala> optionPlayers.flatMap(_.map(_.toUpperCase))
res1: List[java.lang.String] = List(MESSI, XAVI, INIESTA)

scala> optionPlayers.flatten.map(_.toUpperCase)
res2: List[java.lang.String] = List(MESSI, XAVI, INIESTA)

Option他のStackOverflowの質問で、またはWebを検索することで、より多くの情報を見つけることができます。

または、必要なsafeMapメソッドを暗黙的に定義することもできListます。

implicit def enhanceList[T](list: List[T]) = new {
  def safeMap[R](f: T => R) = list.filterNot(_ == null).map(f)
}

だからあなたはすることができます:

scala> players.safeMap(_.toUpperCase)
res4: List[java.lang.String] = List(MESSI, XAVI, INIESTA)

ただし、暗黙的なものを定義する場合はCanBuildFrom、基本的なコレクションのようなスタイルを使用して、それ以上の機能を実現することをお勧めしますList。あなたは他の場所でそれについてのより多くの情報を見つけることができます。

于 2012-04-26T21:02:30.193 に答える