(转)scala 下划线

原文链接

Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就来总结下 Scala 中下划线的用法。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

1、存在性类型:Existential types

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

2、高阶类型参数:Higher kinded type parameters

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

3、临时变量:Ignored variables

val _ = 5

4、临时参数:Ignored parameters

List(123) foreach { _ => println("Hi") }

5、通配模式:Wildcard patterns

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

match {

     case List(1,_,_=" a list with three element and the first element is 1"

     case List(_*)  =" a list with zero or more elements "

     case Map[_,_=" matches a map with any key type and any value type "

     case _ =>

 }

val (a, _= (12)

for (_ <- 1 to 10)

6、通配导入:Wildcard imports

import java.util._

7、隐藏导入:Hiding imports

// Imports all the members of the object Fun but renames Foo to Bar

import com.test.Fun.{ Foo => Bar , _ }

// Imports all the members except Foo. To exclude a member rename it to _

import com.test.Fun.{ Foo =_ _ }

8、连接字母和标点符号:Joining letters to punctuation

def bang_!(x: Int) = 5

9、占位符语法:Placeholder syntax

List(123) map (_ 2)

_ _

( (_: Int) + (_: Int) )(2,3)

val nums = List(1,2,3,4,5,6,7,8,9,10)

nums map (_ 2)

nums sortWith(_>_)

nums filter (_ % 2 == 0)

nums reduceLeft(_+_)

nums reduce (_ _)

nums reduceLeft(_ max _)

nums.exists(_ 5)

nums.takeWhile(_ 8)

10、偏应用函数:Partially applied functions

def fun = {

    // Some code

}

val funLike = fun _

List(123) foreach println _

1 to 5 map (10 _)

//List("foo", "bar", "baz").map(_.toUpperCase())

List("foo""bar""baz").map(n => n.toUpperCase())

11、初始化默认值:default value

var i: Int = _

12、作为参数名:

//访问map

var m3 = Map((1,100), (2,200))

for(e<-m3) println(e._1 ": " + e._2)

m3 filter (e=>e._1>1)

m3 filterKeys (_>1)

m3.map(e=>(e._1*10, e._2))

m3 map (e=>e._2)

//访问元组:tuple getters

(1,2)._2

13、参数序列:parameters Sequence 

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

//Range转换为List

List(1 to 5:_*)

//Range转换为Vector

Vector(1 to 5: _*)

//可变参数中

def capitalizeAll(args: String*) = {

  args.map { arg =>

    arg.capitalize

  }

}

val arr = Array("what‘s""up""doc?")

capitalizeAll(arr: _*)

这里需要注意的是,以下两种写法实现的是完全不一样的功能:

?


1

2

3

foo _               // Eta expansion of method into method value

foo(_)              // Partial function application

Example showing why foo(_) and foo _ are different:

?


1

2

3

4

5

6

7

8

trait PlaceholderExample {

  def process[A](f: => Unit)

  val set: Set[_ => Unit]

  set.foreach(process _// Error 

  set.foreach(process(_)) // No Error

}

In the first case, process _ represents a method; Scala takes the polymorphic method and attempts to make it monomorphic by filling in the type parameter, but realizes that there is no type that can be filled in for A that will give the type (_ => Unit) => ? (Existential _ is not a type).

In the second case, process(_) is a lambda; when writing a lambda with no explicit argument type, Scala infers the type from the argument that foreach expects, and _ => Unit is a type (whereas just plain _ isn‘t), so it can be substituted and inferred.

This may well be the trickiest gotcha in Scala I have ever encountered.

Refer:

[1] What are all the uses of an underscore in Scala?

http://stackoverflow.com/questions/8000903/what-are-all-the-uses-of-an-underscore-in-scala

[2] Scala punctuation (AKA symbols and operators)

http://stackoverflow.com/questions/7888944/scala-punctuation-aka-symbols-and-operators/7890032#7890032

[3] Scala中的下划线到底有多少种应用场景?

http://www.zhihu.com/question/21622725

[4] Strange type mismatch when using member access instead of extractor

http://stackoverflow.com/questions/9610736/strange-type-mismatch-when-using-member-access-instead-of-extractor/9610961

[5] Scala简明教程

http://colobu.com/2015/01/14/Scala-Quick-Start-for-Java-Programmers/

时间: 2024-08-07 07:56:35

(转)scala 下划线的相关文章

scala下划线

作为函数的参数 一个匿名的函数传递给一个方法或者函数的时候,scala会尽量推断出参数类型.例如一个完整的匿名函数作为参数可以写为 scala> def compute(f: (Double)=>Double) = f(3) compute: (f: Double => Double)Double //传递一个匿名函数作为compute的参数 scala> compute((x: Double) => 2 * x) res1: Double = 6.0 如果参数x在=>

Scala中 下划线的用处

From:   http://congli.iteye.com/blog/2169401 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*_). 又如要对缓冲数组Ar

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.在元

转载:浅谈 Scala 中下划线的用途

Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就来总结下 Scala 中下划线的用法. 1.存在性类型:Existential types def foo(l: List[Option[_]]) = ... 2.高阶类型参数:Higher kinded type parameters case class A[K[_],T](a: K[T]) 3

浅谈 Scala 中下划线的用途

Scala 作为一门函数式编程语言,对习惯了指令式编程语言的同学来说,会不大习惯,这里除了思维方式之外,还有语法层面的,比如 underscore(下划线)就会出现在多种场合,令初学者相当疑惑,今天就来总结下 Scala 中下划线的用法. 1.存在性类型:Existential types def foo(l: List[Option[_]]) = ... 2.高阶类型参数:Higher kinded type parameters case class A[K[_],T](a: K[T]) 3

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*_). 4.在元组中,可以用方法_1, _2, _3访问组员.如a._2.其中句点可以用空格替代. 5.使用

字体的下划线

NSString * sit= @"忘记密码"; NSMutableAttributedString *sti =[[NSMutableAttributedString alloc]initWithString:sit]; //设置背景颜色以及下划线 NSDictionary * dict1 = @{//字体颜色 NSForegroundColorAttributeName:[UIColor colorWithRed:33/255.0 green:125/255.0 blue:192/

Python下划线的使用

References: [1]. http://python.jobbole.com/81129/ 本文将讨论Python中下划线(_)字符的使用方法.我们将会看到,正如Python中的很多事情,下划线的不同用法大多数(并非所有)只是常用惯例而已. 单下划线(_) 通常情况下,会在以下3种场景中使用: 1.在解释器中:在这种情况下,“_”代表交互式解释器会话中上一条执行的语句的结果.这种用法首先被标准CPython解释器采用,然后其他类型的解释器也先后采用. Python 1 2 3 4 5 6

css基础 给p标签中的内容 加粗,斜体,下划线,字体大小

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ part code: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8