Scala之若干细小问题汇总
2016-10-13 14:24
218 查看
Scala中下划线的应用场景一
Scala中下划线的应用场景二
identity方法的应用场景
本文原文出处: http://blog.csdn.net/bluishglc/article/details/52806646 严禁任何形式的转载,否则将委托CSDN官方维护权益!
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。
注:本章节参考自网络文章
Higher kinded type parameters
Ignored variables
Ignored parameters
Wildcard patterns
Wildcard imports
Hiding imports
Joining letters to punctuation
Assignment operators
Placeholder syntax
Partially applied functions
注:本章节参考自网络文章
这个方法只是简单的把传出的参数原封不动的再返回, 这看上去很怪异,它主要应用在高阶函数中,作为一个预定义的工具函数,从而避免开发人员反复书写一样的类似的函数。这里举个具体的例子:
List有一个groupBy方法:
def groupBy[K](f: (A) ⇒ K): Map[K, List[A]]
该方法的用途是:通过一个给定的函数,依次把集合中的每一个元素转换(或者说映射)成一个值(类型是K),后续同样映射出这个值的元素会和前面的元素一起放到一个List里,这样最终的返回结果是一个map,map的key是通过传入的函数映射出的key, map的value是所有映射出相同key的元素集合(一个List)。
很多时候我们可能会利用这个方法将集合中的元素进行分组,针对一个分组(也就是每一个唯一的元素),算出重复的元素的数量,代码如下:
上述代码中i=>i就是identity函数的一个适用的例子,由于在这里分组的逻辑是非常简单的,但是groupBy需要的又必须是一个函数,所以我们手写了i=>i这样看上去很怪异的函数字面量。如果我们使用预定义的identity函数,则一切变得自然和优雅了:
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 typesdef 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开发问题汇总(不断更新中)
- Shell细小问题汇总
- 大数据下Hadoop及Hbase使用中遇到的若干问题及汇总
- Scala Hbase 问题汇总 stack overflow
- 有关Libssh2的Win32程序开发中遇到的若干问题的汇总 .
- spark及scala/idea问题汇总
- EF6连接MySQL若干问题汇总
- 2016- Shell细小问题汇总
- g++下make thrift若干问题汇总
- Ionic2 + Angular4 + JSSDK开发中的若干问题汇总
- Silverlight调用WCF若干问题汇总
- Shell细小问题汇总
- Spark-Scala-RDD 入门问题汇总
- Ubuntu无法登录的若干问题汇总
- 比价系统若干问题汇总
- 新手必读】微擎 微赞等系统源码模块若干问题解决方法及说明汇总
- c#中多线程访问winform控件的若干问题
- 将Eclipse代码导入到AndroidStudio时的问题汇总
- 2011.11-项目问题汇总
- \t\t北京社保卡 问题汇总 参保人 结算问题