Scala语言学习

本文深入探讨Scala中的函数类型推断、可变长参数、Lazy特性、泛型、PartialFunction及Future应用等内容,通过实例帮助读者理解Scala编程的核心概念。

= 和=>

  • 函数类型推断
    此时没有写返回值,但是有等号,函数会自己推断返回值,此时的返回值是Int
def add(x:Int, y:Int) = {
    x+y
}

此时没有写返回值,也没有等号,无论函数内部有没有返回值,返回值都是Unit

def add(x:Int, y:Int){
    x+y
}
  • 如果函数仅包含一条语句,那么连花括号都可以选择不写
    def add(x:Int, y:Int) = x+y
  • => 在匿名函数中,用于分隔入参和函数体, 例如: val f = (x: Int) => x + 1

小括号和花括号

  • 当方法的参数只有一个时,两个是等价的。例如 List(10) 等价于 List{10}
  • 花括号可以完成部分数据的初始化
    例如:

    val l = List {
    val x = 10
    x + 20
    }

可变长参数

def echo(args: String*)

Lazy

lazy val property = initProperty() lazy关键字修饰变量后,只有在使用该变量时,才会调用其实例化方法。在实例化时,还会加锁,多线程安全。

Implict

参考:
http://blog.youkuaiyun.com/jameshadoop/article/details/52337949

泛型

override def apply[A](xs: A*): List[A] = xs.toList
class List[+A]

def ::[B >: A] (x: B): List[B] =
new scala.collection.immutable.::(x, this)

Partial Functions(偏函数)

  • 只接受和处理其参数定义域范围内的子集,对于这个参数范围外的参数则抛出异常的函数

例如:PartialFunction[A,B],其中接收一个类型为A的参数,返回一个类型为B的结果
* def isDefinedAt(x: A): Boolean 判断传入来的参数是否在这个偏函数所处理的范围内

完整偏函数例子

val divide = new PartialFunction[Int,Int] {
def isDefinedAt(x: Int): Boolean = x != 0 //判断x是否等于0,当x = 0时抛出异常
def apply(x: Int): Int = 100/x
}  

结合case语句

val divide1 : PartialFunction[Int,Int] = {
case d : Int if d != 0 => 100/d //功能和上面的代码一样,这就是偏函数的强大之处,方便,简洁!!
} 

多个case使用

val rs : PartialFunction[Int , String] = {
case 1 => "One"
case 2 => "Two"
case _ => "Other"
}
  • 如果使用匿名函数,还可以使用case 语句中输入的变量类型来进行数据过滤
    List(1, 3, 5, "seven") collect { case i: Int => i + 1 }

  • List 的map 和 collect

def map[B](f: (A) ⇒ B): List[B] : 接收的是一个函数类型的参数
def collect[B](pf: PartialFunction[A, B]): List[B] 接收的是一个偏函数(partial function)类型的参数

  • Case 语句声明的变量就是偏函数的参数,case语句只接受一个参数,则偏函数的类型声明自然就只有一个参数

Apply

  • 对于函数来说该方法意味着调用function本身
    例如:
    val f = (x: Int) => x + 1
    我们可以通过调用函数 f 的apply方法来调用函数本身,即f.apply(3) ,scala提供更简单的调用方式 f(3)

  • 作为工厂方法
    对于Object 对象来说,我们可以显示调用apply方法,例如 List.apply(1,2,3),等价于List(1,2,3) ,如果方法只有一个参数,等价于使用花括号List {1}

Future

  • 使用前导入类
import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global

使用示例:

Future {
  ...
}

在执行Future.apply{异步代码块}时,主线程将异步代码块交给新的线程,新起的线程负责异步代码块的计算,而主线程则解放出来,执行下一步。

航拍图像多类别实例分割数据集 一、基础信息 • 数据集名称:航拍图像多类别实例分割数据集 • 图片数量: 训练集:1283张图片 验证集:416张图片 总计:1699张航拍图片 • 训练集:1283张图片 • 验证集:416张图片 • 总计:1699张航拍图片 • 分类类别: 桥梁(Bridge) 田径场(GroundTrackField) 港口(Harbor) 直升机(Helicopter) 大型车辆(LargeVehicle) 环岛(Roundabout) 小型车辆(SmallVehicle) 足球场(Soccerballfield) 游泳池(Swimmingpool) 棒球场(baseballdiamond) 篮球场(basketballcourt) 飞机(plane) 船只(ship) 储罐(storagetank) 网球场(tennis_court) • 桥梁(Bridge) • 田径场(GroundTrackField) • 港口(Harbor) • 直升机(Helicopter) • 大型车辆(LargeVehicle) • 环岛(Roundabout) • 小型车辆(SmallVehicle) • 足球场(Soccerballfield) • 游泳池(Swimmingpool) • 棒球场(baseballdiamond) • 篮球场(basketballcourt) • 飞机(plane) • 船只(ship) • 储罐(storagetank) • 网球场(tennis_court) • 标注格式:YOLO格式,包含实例分割的多边形坐标,适用于实例分割任务。 • 数据格式:航拍图像数据。 二、适用场景 • 航拍图像分析系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割航拍图像中各种物体的AI模型,用于地理信息系统、环境监测等。 • 城市
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值