Scala

Stella981
• 阅读 752

欢迎大家关注: scala工具库 ,里面包含各种库的测试用例和使用说明文档

##模式匹配 使用用模式匹配实现斐波那契

def fibonacci(in: Any): Int = in match {
    case 0 => 0
    case 1 => 1
    case n: Int if(n > 1)=> fibonacci(n - 1) + fibonacci(n - 2)
    case _ => 0
}

println(fibonacci(3))

##元组tuple 元组可以保存不同类型的值,不能通过名称获取字段,而是使用位置下标来读取对象;而且这个下标基于1,而不是基于0。

val hostPort = ("localhost", 80)
println("host:%s,port:%s".format(hostPort._1,hostPort._2))

执行结果:

host:localhost,port:80

##选项 Option Option 是一个表示有可能包含值的容器。 Option基本的接口是这样的:

trait Option[T] {
  def isDefined: Boolean
  def get: T
  def getOrElse(t: T): T
}

##映射 Map Option本身是泛型的,并且有两个子类: Some[T] 或 None Map.get 使用 Option 作为其返回值,表示这个方法也许不会返回你请求的值。

val map = Map(1 -> "one", 2 -> "two")
println(map.get(2))
println(map.get(3))

执行结果:

Some(two)
None

##函数组合子(Functional Combinators) ###map map对列表中的每个元素应用一个函数,返回应用后的元素所组成的列表。

    val numbers = List(1, 2, 3)
    val double = numbers.map((i: Int) => i * 2)
    val squared = numbers.map((i: Int) => BigInt(i).pow(3))
    println("%s".format(numbers))
    println(double)
    println(squared)
    //传入一个部分应用函数
    def timesTwo(i: Int): Int = i * 2
    val doubleFunction = numbers.map(timesTwo _)
    println(doubleFunction)

执行结果:

List(1, 2, 3)
List(2, 4, 6)
List(1, 8, 27)
List(2, 4, 6)

###foreach foreach很像map,但没有返回值。foreach仅用于有副作用[side-effects]的函数

    //foreach返回值为Unit即void
    val foreachResult = numbers.foreach { (i: Int) => i * 2 }
    println(foreachResult)

执行结果:

()

###filter filter移除任何对传入函数计算结果为false的元素

    val filterResult = numbers.filter { (i: Int) => i % 2 == 0 }
    println(filterResult)

执行结果:

List(2)

###zip zip将两个列表的内容聚合到一个对偶列表中,多余的元素删除

    val zipResult = numbers.zip(List('a', 'b', 'c', 'd'))
    println(zipResult)

执行结果:

List((1,a), (2,b), (3,c))

###partition partition将使用给定的谓词函数分割列表。

    val partitionResult = numbers.partition { _ % 2 == 0 }
    println("partition result:%s".format(partitionResult))

执行结果:

partition result:(List(2),List(1, 3))

###find find返回集合中第一个匹配谓词函数的元素

    var findResult = numbers.find(_ == 1)
    println("find result:%s".format(findResult))
    findResult = numbers.find(_ > 3)
    println("find result:%s".format(findResult))

执行结果:

find result:Some(1)
find result:None

###drop&dropWhile drop删除前i个元素,dropWhile删除直到不满足谓词函数的元素

    var dropResult = numbers.drop(2)
    println("drop result:%s".format(dropResult))
    dropResult = numbers.dropWhile(_ % 2 != 0)
    println("dropWhile result:%s".format(dropResult))

执行结果:

drop result:List(3)
dropWhile result:List(2, 3)

###foldLeft&foldRight 0为初始值(记住numbers是List[Int]类型),m作为一个累加器,foldRight与foldLeft运行过程相反

    var foldLeftResult = numbers.foldLeft(0) {
      (m: Int, n: Int) => println("m:" + m + " n:" + n); m + n
    }
    println("foldLeft result:%s".format(foldLeftResult))
    var foldRightResult = numbers.foldRight(0) {
      (m: Int, n: Int) => println("m:" + m + " n:" + n); m + n
    }
    println("foldRight result:%s".format(foldRightResult))

执行结果:

m:0 n:1
m:1 n:2
m:3 n:3
foldLeft result:6
m:3 n:0
m:2 n:3
m:1 n:5
foldRight result:6

###flatten flatten将嵌套结构扁平化为一个层次的集合

    var flattenResult = List(List(1, 2, 3), List(4, 5, 6)).flatten
    println("flatten result:%s".format(flattenResult))

执行结果:

flatten result:List(1, 2, 3, 4, 5, 6)

###flatMap flatMap是一种常用的组合子,结合映射[mapping]和扁平化[flattening]。 flatMap需要一个处理嵌套列表的函数,然后将结果串连起来。flatMap是map和flatten的组合。

    val nestedNumbers = List(List(1, 2), List(3, 4))
    var flatMapResult = nestedNumbers.flatMap(x => x.map(_ * 2))
    println("flatMap result:%s".format(flatMapResult))
    flatMapResult = nestedNumbers.map(x => x.map(_ * 2)).flatten
    println("flatMap result:%s".format(flatMapResult))

执行结果:

flatMap result:List(2, 4, 6, 8)
flatMap result:List(2, 4, 6, 8)

##广告 点击Spark加入群Spark,分享更多Spark相关信息

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这