Scala之若干细小问题汇总

时间:2022-03-24 17:35:55

本文原文出处: http://blog.csdn.net/bluishglc/article/details/52806646 严禁任何形式的转载,否则将委托CSDN官方维护权益!

Scala中下划线的应用场景(一)

1、作为“通配符”,类似Java中的*。如import scala.math._

2、:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理!例如val s = sum(1 to 5:_*)就是将1 to 5当作参数序列处理。

3、指代一个集合中的每个元素。例如我们要在一个Array a中筛出偶数,并乘以2,可以用以下办法:
a.filter(%2==0).map(2*)。
又如要对缓冲数组ArrayBuffer b排序,可以这样:
val bSorted = b.sorted(_
4、在元组中,可以用方法_1, _2, _3访问组员。如a._2。其中句点可以用空格替代。

5、使用模式匹配可以用来获取元组的组员,例如
val (first, second, third) = t
但如果不是所有的部件都需要,那么可以在不需要的部件位置上使用。比如上一例中val (first, second, ) = t

6、还有一点,下划线_代表的是某一类型的默认值。
对于Int来说,它是0。
对于Double来说,它是0.0
对于引用类型,它是null。

注:本章节参考自网络文章


Scala中下划线的应用场景(二)

  • Existential types

    def foo(l: List[Option[_]]) = ...

  • Higher kinded type parameters

    case class A[K[_],T](a: K[T])

  • Ignored variables

    val _ = 5

  • Ignored parameters

    List(1, 2, 3) foreach { _ => println("Hi") }

  • Wildcard patterns

    Some(5) match { case Some(_) => println("Yes") }

  • Wildcard imports

    import java.util._

  • Hiding imports

    import java.util.{ArrayList => _, _}

  • Joining letters to punctuation

    def bang_!(x: Int) = 5

  • Assignment operators

    def foo_=(x: Int) { ... }

  • Placeholder syntax

    List(1, 2, 3) map (_ + 2)

  • Partially applied functions

    List(1, 2, 3) foreach println _

注:本章节参考自网络文章


identity方法的应用场景

scala.Predef#identity方法的文档是: http://www.scala-lang.org/api/current/index.html#scala.Predef$@identity[A](x:A):A

这个方法只是简单的把传出的参数原封不动的再返回, 这看上去很怪异,它主要应用在高阶函数中,作为一个预定义的工具函数,从而避免开发人员反复书写一样的类似的函数。这里举个具体的例子:

List有一个groupBy方法:

def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]

该方法的用途是:通过一个给定的函数,依次把集合中的每一个元素转换(或者说映射)成一个值(类型是K),后续同样映射出这个值的元素会和前面的元素一起放到一个List里,这样最终的返回结果是一个map,map的key是通过传入的函数映射出的key, map的value是所有映射出相同key的元素集合(一个List)。

很多时候我们可能会利用这个方法将集合中的元素进行分组,针对一个分组(也就是每一个唯一的元素),算出重复的元素的数量,代码如下:

scala> val a: Array[Int] = Array(1, 12, 3, 4, 1)
a: Array[Int] = Array(1, 12, 3, 4, 1)

scala> a.groupBy(i=>i)
res1: scala.collection.immutable.Map[Int,Array[Int]] = Map(4 -> Array(4), 1 -> Array(1, 1), 3 -> Array(3), 12 -> Array(12))

scala> a.groupBy(i=>i).mapValues { _.length }
res2: scala.collection.immutable.Map[Int,Int] = Map(4 -> 1, 1 -> 2, 3 -> 1, 12 -> 1)

上述代码中i=>i就是identity函数的一个适用的例子,由于在这里分组的逻辑是非常简单的,但是groupBy需要的又必须是一个函数,所以我们手写了i=>i这样看上去很怪异的函数字面量。如果我们使用预定义的identity函数,则一切变得自然和优雅了:

scala> a.groupBy(identity)
res3: scala.collection.immutable.Map[Int,Array[Int]] = Map(4 -> Array(4), 1 -> Array(1, 1), 3 -> Array(3), 12 -> Array(12))

scala> a.groupBy(identity).mapValues { _.length }
res4: scala.collection.immutable.Map[Int,Int] = Map(4 -> 1, 1 -> 2, 3 -> 1, 12 -> 1)