scala-笔记1

   一直想写些技术性的笔记,以便自己加深印象以及方便其他人阅读。奈于对自己的文字功底实在不敢恭维,甚至一直舍不得花时间投入这种输出性的写作事项,一直拖到现在。希望自己能坚持下去!

1:两个filter函数合并

```scala```

defdirectedMoreThanOneFilm(numberOfFilms: Int):Seq[String] =

directors.filter(_.films.size >1).map(_.lastName)defbornBefore(year:

Int):Seq[String] =   directors.filter(_.yearOfBirth >

year).map(_.lastName)

```

```scala

def and[A](f: A => Boolean, g: A => Boolean): A => Boolean = a => f(a) && g(a)

```

通过上述函数声明,我们可以将其上的两个filter函数进行合并如下:

```scala

defdirectedMoreThanOneFilm:Director=>Boolean= _.films.size >1defbornBefore(year:Int):Director=>Boolean= _.yearOfBirth > yeardefresult=directors.filter(and(directedMoreThanOneFilm, bornBefore(2018))).map(_.lastName)

```

2:将序列类型中的对象分组

```scala

case class Person(val age:Int, val name:String) {

override def toString = {

"P = " + age.toString +" / " + name +"; "

  }

}

object Person {

def main(args:Array[String]):Unit = {

val persons:Seq[Person] =Seq(Person(25, "a"), Person(35, "b"), Person(27, "c"))

val m = mutable.Map[Int, Seq[Person]]()

val result =persons.map { person =>

val ageGroup = person.age /10

      ageGroup -> person

}

//print each element in map    method1

//    result.foreach { case (bracket, person) =>

//      m(bracket) = m.getOrElse(bracket, Seq[Person]()) :+ person

//    }

    m.foreach(println)//Having a mutable datastructure outside a function is generally frowned upon.

//method2

    val resultMap:Map[Int, Seq[Person]] =result.foldLeft(mutable.Map[Int, Seq[Person]]()) {case (map, (ageGroup, person)) =>

val result2 =m.getOrElse(ageGroup, Seq[Person]()) :+person

      m(ageGroup) =result2

      map(ageGroup) =result2

map

    }.toMap

resultMap.foreach(println)// by foldLeft

//method3

    val mapGourpBy:Map[Int, Seq[Person]] =persons.groupBy(person => math.floor(person.age /10).toInt)

mapGourpBy.foreach(println)//by GroupBy

  }

}

````

3:集合自动转换为函数

```scala

val myMap: Map[String, Int] = Map(

    "one" -> 1,

    "two" -> 2,

    "three" -> 3,

    "four" -> 4,

    "five" -> 5,

  )

  val mySet = Set("one", "two", "three")

  println(myMap.filterKeys(mySet)) // Why `Set[String]` could be treated as `[String] => Bool`

Set extends Function1

and it's apply is containment

remember lists do that too

@ (0 to 5).map(('a' to 'z').toList)

res9: collection.immutable.IndexedSeq[Char] = Vector('a', 'b', 'c', 'd', 'e', 'f')

```

你可能感兴趣的