本文原文出处: http://blog.****.net/bluishglc/article/details/52806646 严禁任何形式的转载,否则将委托****官方维护权益!
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)