Scala代码段:如何在Scala中过滤列表

在Scala中,过滤和处理集合既简单又优雅。 有许多过滤方法可用,但最常用的可能是基本过滤方法。

这是一个对我(相机)收藏进行过滤的代码示例。
filter方法不仅适用于列表,而且适用于任何Scala集合。

object MyCameraCollection02 {

  class Camera(_brand: String, _model: String, _sensorType: String, _yearBought: Int) {
    val brand: String = _brand
    val model: String = _model
    val yearBought = _yearBought
    val sensorType = _sensorType

    override def toString(): String = {
      return "%s %s \t\t %s \t(%d)" format(brand, model, sensorType, yearBought)
    }

  }

  def main(args: Array[String]) {

    val canon5dmarkIII = new Camera("Canon", "5D MkIII", "FF", 2013)
    val canon5dmarkII = new Camera("Canon", "5D MkII", "FF", 2009)
    val canon6d = new Camera("Canon", "6D", "FF", 2014)
    val canon550d = new Camera("Canon", "550D", "APS-C", 2010)
    val canon40d = new Camera("Canon", "40D", "APS-C", 2008)
    val canonIXUS330 = new Camera("Canon", "IXUS 330", "1/2.7", 2001)
    val canonIXUSZ90 = new Camera("Canon", "IXUS Z90", "APS-C", 1999)
    val panasonicGM1 = new Camera("Panasonic", "GM1", "M43", 2014)
    val panasonicFZ20 = new Camera("Panasonic", "FZ20", "1/2.5", 2005)
    val sonyrx100 = new Camera("Sony", "DSC-RX100", "1\"", 2013)
    val sonynex5 = new Camera("Sony", "NEX-5", "APS-C", 2011)
    val sonyr1 = new Camera("Sony", "DSC-R1", "APS-C", 2005)

    val myCameras = List(canon5dmarkIII, canon5dmarkII, canon6d, canon550d, canon40d, canonIXUS330, canonIXUSZ90, panasonicGM1, panasonicFZ20, sonyrx100, sonynex5, sonyr1)
    val canonCameras = myCameras.filter(x => x.brand == "Canon") // Every Canon camera I ever owned
    val sonyCameras = myCameras.filter(x => x.brand == "Sony") // Every Sony camera I ever owned
    val pansonicCameras = myCameras.filter(x => x.brand == "Panasonic") // Every Panasonic camera I ever owned


	// apscCamera's only 
    val apscCameras = myCameras.filter(cam => cam.sensorType == "APS-C")
    println("==APS-C camera's owned==")
    apscCameras foreach (cam => println(cam))
    println


	// Canon camera's which are not full frame. You can filter, filtered lists.
    val canonNonFF = myCameras.filter(x => x.brand == "Canon").filter(x => x.sensorType != "FF")
    println("==Non-FF camera's owned==")
    canonNonFF foreach (cam => println(cam))
    println
	
	// Filter by boolean expressions on class properties
    val apsBefore2012 = apscCameras.filter(cam => cam.yearBought < 2012)
    println("==APS-C camera's bought before 2012 owned==")
    apsBefore2012.foreach(cam => println(cam))
    println

	// Filter by combining boolean expressions.
    val ffcamerasBefore2012 = myCameras.filter(cam => cam.yearBought < 2012 && cam.sensorType == "FF")
    println("==Every FF Camera I ever owned before 2012==")
    ffcamerasBefore2012.foreach(cam => println(cam))
    println
  }

}

运行此示例将为您提供以下结果:

==APS-C camera's owned==
Canon 550D 		 APS-C 	(2010)
Canon 40D 		 APS-C 	(2008)
Canon IXUS Z90 		 APS-C 	(1999)
Sony NEX-5 		 APS-C 	(2011)
Sony DSC-R1 		 APS-C 	(2005)

==Non-FF camera's owned==
Canon 550D 		 APS-C 	(2010)
Canon 40D 		 APS-C 	(2008)
Canon IXUS 330 		 1/2.7 	(2001)
Canon IXUS Z90 		 APS-C 	(1999)

==APS-C camera's bought before 2012 owned==
Canon 550D 		 APS-C 	(2010)
Canon 40D 		 APS-C 	(2008)
Canon IXUS Z90 		 APS-C 	(1999)
Sony NEX-5 		 APS-C 	(2011)
Sony DSC-R1 		 APS-C 	(2005)

==Every FF Camera I ever owned before 2012==
Canon 5D MkII 		 FF 	(2009)

翻译自: https://www.javacodegeeks.com/2015/04/scala-snippet-how-to-filter-a-list-in-scala.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值