Snippet 博客主题

Scala

Scala内部类与外部类及内部类作用域

scala内部类与外部类,以及扩大内部类作用域的两种方式,内部类访问外部类的变量的方式。 内部类与外部类实例1234567891011121314151617181920212223package com.scala.baseimport scala.collection.mutable.ArrayBufferobject Class { def main(args: Array[String]): Unit = { val c1=new Class val leo=c1.register("leo") c1.students+=leo val c2=new Class val jack=c2.register("jack") c2.students+=jack }}class Class{ class Student(val name:String) val students=new ArrayBuffer[Student] def register(name:String):Student={ new Student(name) }}…

柯里化

概念柯里化(Currying)指的是将原来接受两个参数的函数变成新的接受一个参数的函数的过程。新的函数返回一个以原有第二个参数为参数的函数。定义一个函数1def add(x:Int,y:Int)=x+y 调用时:add(1,2)将函数变形为:1def add(x:Int)(y:Int) = x + y 调用时:add(1)(2)以上的过程就是柯里化…

Scala的Symbol类型

相比较于String类型,Symbol类型有两个比较明显的特点:节省内存和快速比较 String的internString类内部维护一个字符串池(strings pool),当调用String的intern()方法时,如果字符串池中已经存在该字符串,则直接返回池中字符串引用,如果不存在,则将该字符串添加到池中,并返回该字符串对象的引用。执行过intern()方法的字符串,我们就说这个字符串被拘禁了(interned)。默认情况下,代码中的字符串字面量和字符串常量值都是被拘禁的,例如:1234String s1 = "abc";String s2 =new String("abc");//返回trueSystem.out.println(s1 == s2.intern()); 同值字符串的intern()方法返回的引用都相同,例如:1234567String s2 = new String("abc");String s3 = new String("abc");//返回trueSystem.out.println(s2.intern() == s3.intern());//返回falseSystem.out.println(s2 == s3);…

Scala跳出循环的3中方法

Java里经常会用到continue和break,Scala里并没有这俩个语法。介绍三种跳出循环的方式,使用boolean变量、使用return、使用Breaks对象的break方法…

class与Case class的区别

在Scala中存在case class,它其实就是一个普通的class。但是它又和普通的class略有区别,如下: 初始化的时候可以不用new,当然你也可以加上,普通类一定需要加new toString的实现更漂亮 默认实现了equ...

Scala集合

数组是一种可变的、可索引的数据集合。在Scala中用Array[T]的形式来表示Java中的数组形式 T[]。以下介绍各种集合操作方法。 1. ++合并集合,并返回一个新的数组,新数组包含左右两个集合对象的内容。1def ++[B](...

Scala学习之偏函数-异常-lazy

偏函数:当函数有多个参数,而在使用该函数时不想提供所有参数(比如函数有3个参数),只提供0~2个参数,此时得到的函数便是偏函数。 Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载)。 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量。…

Scala学习之泛型-上边界-下边界

1.Scala的类,函数,方法都可以是泛型2.上边界 “<:”表达了泛型的类型必须是某种类型或者其子类,是对类型的限定3.下边界 “>:”表达了泛型的类型必须是某种类型或者其父类,是对类型的限定4.View bound:把类型转换为目标类型,是上边界和下边界的加强版本 T <% ,这个代码所表达的T必须是writable类型的,但是T没有直接继承Writable接口,此时需要通过“implicit”的方式来实现这个功能。implicit def dog2Person(dog:Dog)=new Person(dog.name)5.T:ClassTag:这也是一种类型转换系统,只是在编译时类型信息不够,需要借助JVM的runtime来通过运行时获得完整的类型信息。6.逆变协变:-T +T7.covariant 协变:使你能够使用比原始指定的类型的子类,当我们定义一个协变类型 List[A+] 时,List[Child]可以是List[Parent]的子类型。8.Contravariance 逆变:使你能够使用比原始指定的类型的父类。当我们定义一个逆变类型 List[-A] 时,List[Child]可以是List[Parent]的父类型。9.context bound,T:Ordering这种语法必须能够变成Ordering T格式10.Invariance 不变。你只能使用原始指定的类型,不能协变和逆变…

Scala学习之集合函数式编程

1.在scala中,Iterable是公共的方法 ,Iterable要求继承者实现一些公共的方法。2.Array是一个非常基础的数据结构,不属于scala集合体系。3.集合分为可变与不可变之分,不可变的集合在scala.collection.immutable保中,可变集合在scala.collection.mutable中4.List是元素的列表集合,是不可变的。5.List中head是第一个元素,tail是指剩下元素的集合的集合6.操作符”::”把List和其它的元素进行组拼来构建新的List7.如果集合中没有元素,返回Nil8.LinkedList是元素可变的列表9.Set是元素不可重复的,且元素是无序的。HashSet元素不可变,也不保证顺序。SortedSet会排序10.map与flatMap的区别:Spark 中 map函数会对每一条输入进行指定的操作,然后为每一条输入返回一个对象;而flatMap函数则是两个操作的集合——正是“先映射后扁平化”: 操作1:同map函数一样:对每一条输入进行指定的操作,然后为每一条输入返回一个对象 操作2:最后将所有对象合并为一个对象11.只有一个原始时,可以用”_“占位符替代,简化函数编程。如:.reduce(_ +_); //reduce((x,y) => x + y)…

Scala学习之模式匹配

1.样本类:添加了case的类便是样本类。这种修饰符可以让Scala编译器自动为这个类添加一些语法上的便捷设定。如下:2.添加与类名一致的工厂方法。也就是说,可以写成Var(“x”)来构造Var对象。3.样本类参数列表中的所有参数隐式获得了val前缀,因此它被当作字段维护。4.编译器为这个类添加了方法toString,hashCode和equals等方法。5..match对应Java里的switch,但是写在选择器表达式之后。即: 选择器 match {备选项}。6.一个模式匹配包含了一系列备选项,每个都开始于关键字case。每个备选项都包含了一个模式及一到多个表达式。箭头符号 => 隔开了模式和表达式。7.match表达式通过以代码编写的先后次序尝试每个模式来完成计算。类似于UnOp(“-“ , UnOp(“-“ , e))这种形式的,是构造器模式匹配。8.Scala的备选项表达式永远不会“掉到”下一个case;9.如果没有模式匹配,MatchError异常会被抛出。这意味着必须始终确信所有的情况都考虑到了,或者至少添加一个默认情况什么都不做。如 case _ =>10.通配模式:case _ => 。表示默认的全匹配备选项。通配模式还可以用来忽略对象中不关心的部分。如:case BinOp(_,_,_) => XXX,则表示不关心二元操作符的元素是什么,只是检查是否为二元操作符11.常量模式 :仅匹配自身。任何字面量都可以用作常量。包括String类型。另外,任何的val或单例对象也可以被用作常量。如,单例对象Nil是只匹配空列表的模式。12.变量模式 :变量模式类似于通配符,可以匹配任何对象。不同点在于,Scala把变量绑定在匹配的对象上。之后就可以使用这个变量操作对象。…