您的位置:首页 > 其它

Scala之若干细小问题汇总

2016-10-13 14:24 218 查看
Scala中下划线的应用场景一

Scala中下划线的应用场景二

identity方法的应用场景

本文原文出处: 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala 笔记 教程 问题