public class JavaCollection {
public static void main(String[] args) {
//不可变集合类似 java 的数组
int[] nums = new int[3];
nums[2] = 11; //?
nums[2] = 22;
//nums[3] = 90; //?
// String[] names = {"bj", "sh"};
// System.out.println(nums + " " + names);
//
// //可变集合举例
ArrayList al = new ArrayList();
al.add("zs");
al.add("zs2");
System.out.println(al + " 地址= " + al.hashCode()); //地址
al.add("zs3");
System.out.println(al + " 地址 2=" + al.hashCode()); //地址
}
}
object ArrayDemo01 {
def main(args: Array[String]): Unit = {
//说明
//1. 创建了一个 Array 对象, //2. [Int] 表示泛型,即该数组中,只能存放 Int
//3. [Any] 表示 该数组可以存放任意类型
//4. 在没有赋值情况下,各个元素的值 0
//5. arr01(3) = 10 表示修改 第 4 个元素的值
val arr01 = new Array[Int](4)
println(arr01.length) //4
println("arr01(0)="+arr01(0)) //0
for(i <- arr01){
println(i)
}
println("=====================")
arr01(3)=10
for(i <- arr01){
println(i)
}
}
}
object ArrayDemo02 {
def main(args: Array[String]): Unit = {
//说明
//1. 使用的是 object Array 的 apply
//2. 直接初始化数组,这时因为你给了 整数和 "", 这个数组的泛型就 Any
//3. 遍历方式一样
var arr02 =Array(1,3,"zxc")
arr02(0)="zhangshan"
arr02(2)=123
for(i <- arr02) {
println(i)
// zhangshan
// 3
// 123
}
//可以使用我们传统的方式遍历,使用下标的方式遍历
for(index <- 0 to arr02.length-1){
printf("arr02[%d]=%s",index,arr02(index)+"\t")
}
}
}
object ArrayBufferDemo01 {
def main(args: Array[String]): Unit = {
val arr01 = ArrayBuffer[Any](3,2,5)
println("arr01(1)="+arr01(1)) //2
for(i <- arr01){
println(i)
}
println(arr01.length) //3
println("arr01.hash="+arr01.hashCode()) //110266112
//使用 append 追加数据 ,append 支持可变参数
//可以理解成 java 的数组的扩容
arr01.append(90.0,13)
println("arr01.hash="+arr01.hashCode()) //-70025354
arr01(1)=89
println("==================")
for(i <-arr01){
println(i) //3,89,5,90.0,13
}
arr01.remove(0)
println("--------删除后的元素遍历---------------")
for(i <- arr01){
println(i) //89,5,90.0,13
}
println("最新的长度=" + arr01.length) //4
}
}
object Array22ArrayBuffer {
def main(args: Array[String]): Unit = {
val arr2 = ArrayBuffer[Int]()
arr2.append(1,2,3)
println(arr2)
//说明
//1. arr2.toArray 调用 arr2 的方法 toArray
//2. 将 ArrayBuffer ---> Array
//3. arr2 本身没有任何变化
val newArr = arr2.toArray
println(newArr)
//说明
//1. newArr.toBuffer 是把 Array->ArrayBuffer
//2. 底层的实现
/*
override def toBuffer[A1 >: A]: mutable.Buffer[A1] = {
val result = new mutable.ArrayBuffer[A1](size)
copyToBuffer(result)
result
}
*/
//3. newArr 本身没变化
val newArr2 = newArr.toBuffer
newArr2.append(123)
println(newArr2)
}
}
object MultiplyArray {
def main(args: Array[String]): Unit = {
//创建
val arr =Array.ofDim[Int](3,4)
//遍历
for(item <- arr){//取出二维数组的各个元素(一维数组)
for(item2 <- item){// 元素(一维数组) 遍历
print(item2+"\t")
}
println()
}
//指定取出
arr(1)(1)=6
println(arr(1)(1))
//传统遍历
for(i <- 0 to arr.length-1){
for(j <- 0 to arr(i).length-1){
printf("arr[%d][%d]=%d\t",i,j,arr(i)(j))
}
println()
}
}
}
object ArrayBuffer2JavaList {
def main(args: Array[String]): Unit = {
// Scala 集合和 Java 集合互相转换
val arr = ArrayBuffer("1", "2", "3")
/*
implicit def bufferAsJavaList[A](b : scala.collection.mutable.Buffer[A]) : java.util.List[A] = { /*
compiled code */ }
*/
import scala.collection.JavaConverters.bufferAsJavaList
//对象 ProcessBuilder , 因为 这里使用到上面的 bufferAsJavaList
val javaArr = new ProcessBuilder(arr) //为什么可以这样使用?
// 这里 arrList 就是 java 中的 List
val arrList = javaArr.command()
println(arrList) //输出 [1, 2, 3]
}
}
trait MyTrait01 {}
class A extends MyTrait01 {}
object B {
def test(m: MyTrait01): Unit = {
println("b ok..")
}
}
//明确一个知识点
//当一个类继承了一个 trait
//那么该类的实例,就可以传递给这个 trait 引用
val a01 = new A
B.test(a01)
//java 的 List 转成 scala 的 ArrayBuffer
//说明
//1. asScalaBuffer 是一个隐式函数
/*
implicit def asScalaBuffer[A](l : java.util.List[A]) : scala.collection.mutable.Buffer[A] = { /* compiled
code */ }
*/
import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.mutable
// java.util.List ==> Buffer
val scalaArr: mutable.Buffer[String] = arrList
scalaArr.append("jack")
scalaArr.append("tom")
scalaArr.remove(0)
println(scalaArr) // (2,3,jack,tom)
object TupleDemo01 {
def main(args: Array[String]): Unit = {
//创建
//说明 1. tuple1 就是一个 Tuple 类型是 Tuple5
//简单说明: 为了高效的操作元组 , 编译器根据元素的个数不同,对应不同的元组类型
// 分别 Tuple1----Tuple22
val tuple1=(1,2,3,"hello",4)
println(tuple1)
}
}
//遍历和访问元组
val t1=(1,"a","b",true,2)
println(t1._1)// 1 //访问元组的第一个元素 ,从 1 开始
println(t1.productElement(0))// 0 // 访问元组的第一个元素,从 0 开始
//原理
/*
override def productElement(n: Int) = n match {
case 0 => _1
case 1 => _2
case 2 => _3
case 3 => _4
case 4 => _5
case _ => throw new IndexOutOfBoundsException(n.toString())
}
*/
println("==================遍历元组=========================")
//遍历元组, 元组的遍历需要使用到迭代器
for(item <- t1.productIterator){
println("item="+item)
}
object ListDemo01 {
def main(args: Array[String]): Unit = {
//说明
//1. 在默认情况下 List 是 scala.collection.immutable.List,即不可变
//2. 在 scala 中,List 就是不可变的,如需要使用可变的 List,则使用 ListBuffer
//3. List 在 package object scala 做了 val List = scala.collection.immutable.List
//4. val Nil = scala.collection.immutable.Nil // List()
val list01=List(1,2,3)//创建时,直接分配元素
println(list01)
val list02=Nil //空集合
println(list02)
}
}
//访问 List 的元素
val value1 = list01(1) // 1 是索引,表示取出第 2 个元素.
println("value1=" + value1) // 2
println("-------------list 追加元素后的效果-----------------")
//通过 :+ 和 +: 给 list 追加元素(本身的集合并没有变化)
var list1=List(1,2,3,4,"hello")
//在元素的最后加
val list2=list1:+5
println(list1) //list1 没有变化 (1, 2, 3, "abc"),说明 list1 还是不可变
println(list2) //新的列表结果是 (1, 2, 3, "abc", 4)
//在元素的前面加
val list3=6+:list1
println(list3) //List(6, 1, 2, 3, 4, hello)
//::符号的使用
val list4=List(1,2,3,4,"zxc")
val list5=4::5::6::list4::Nil
println(list5)
//说明 val list5 = 4 :: 5 :: 6 :: list4 :: Nil 步骤
//1. List()
//2. List(List(1, 2, 3, "abc"))
//3. List(6,List(1, 2, 3, "abc"))
//4. List(5,6,List(1, 2, 3, "abc"))
//5. List(4,5,6,List(1, 2, 3, "abc"))
val list6=4::5::6::list4:::Nil
println(list6)
//说明 val list6 = 4 :: 5 :: 6 :: list4 ::: Nil 步骤
//1. List()
//2. List(1, 2, 3, "abc")
//3. List(6,1, 2, 3, "abc")
//4. List(5,6,1, 2, 3, "abc")
//5. List(4,5,6,1, 2, 3, "abc")
object ListBufferDemo01 {
def main(args: Array[String]): Unit = {
//创建ListBuffer
val lst0=ListBuffer[Int](1,2,3,4)
//如何访问
println("lst0(2)="+lst0(2))
for(item <- lst0){// 遍历,是有序
println("item="+item)
}
//动态的增加元素,lst1 就会变化, 增加一个一个的元素
val lst1=new ListBuffer[Int]//空的 ListBuffer
lst1+=4// lst1 (4)
lst1.append(5)// list1(4,5)
lst0 ++= lst1// lst0 (1, 2, 3,4,4,5)
for(item <- lst0){// 遍历,是有序
print("item="+item+"\t")
}
val lst2=lst0++lst1 // lst2(1, 2, 3,4,4,5,4,5)
val lst3=lst0:+5 //lst0 不变 lst3 (1, 2, 3,4,4,5,5)
println("lst3=" + lst3)
println("=====删除=======")
println("lst1=" + lst1)
lst1.remove(1) // 表示将下标为 1 的元素删除
for (item <- lst1) {
println("item=" + item) //4
}
}
}
object QueueDemo01 {
def main(args: Array[String]): Unit = {
val q1 =new mutable.Queue[Int]
println(q1)
}
}
//给队列增加元素
q1+=20
println("q1="+q1) //q1=Queue(20)
q1++=List(1,2,3) // 默认值直接加在队列后面
println("q1="+q1) //q1=Queue(20, 1, 2, 3)
//q1 += List(10,0) // 表示将 List(10,0) 作为一个元素加入到队列中,
在队列中,严格的遵守,入队列的数据,放在队位,出队列的数据是队列的头部取出
//dequeue 从队列的头部取出元素 q1 本身会变
val queueElement=q1.dequeue()
println(queueElement)
println("q1="+q1)
//enQueue 入队列,默认是从队列的尾部加入. Redis
q1.enqueue(100,10,100,888)
println("q1="+q1) //q1=Queue(1, 2, 3, 100, 10, 100, 888)
println("============Queue-返回队列的元素=================")
//队列 Queue-返回队列的元素
//1. 获取队列的第一个元素
println(q1.head)// 1, 对 q1 没有任何影响
//2. 获取队列的最后一个元素
println(q1.last) //888,对 q1 没有任何影响
//3. 取出队尾的数据 ,即:返回除了第一个以外剩余的元素,可以级联使用
println(q1.tail) //Queue(2, 3, 100, 10, 100, 888)
println(q1.tail.tail.tail.tail) //Queue(10, 100, 888)
public class JavaHashMap {
public static void main(String[] args) {
HashMap hm = new HashMap();
hm.put("no1",100);
hm.put("no2",200);
hm.put("no3",300);
hm.put("no4",400);
System.out.println(hm); //无序的
System.out.println(hm.get("no2"));
}
}
object MapDemo01 {
def main(args: Array[String]): Unit = {
//1.默认 Map 是 immutable.Map
//2.key-value 类型支持 Any
//3.在 Map 的底层,每对 key-value 是 Tuple2
//4.从输出的结果看到,输出顺序和声明顺序一致
val map1 =Map("Alice"->10,"Bob"->20,"kotlin"->"北京")
println(map1)
}
}
//方式2-构造可变映射
//1.从输出的结果看到,可变的 map 输出顺序和声明顺序不一致
val map2 = mutable.Map("Alice" -> 10, "Bob" -> 20, "kotlin" -> "上海")
println(map2)
val map3 = new mutable.HashMap[String, Int]
println("map3="+map3)
val map4 = mutable.Map(("zxc", 10), ("www", 20), ("Bob", "广州"))
println("map4"+map4)
//方式 1-使用 map(key)
println(map4("Alice")) // 10
//抛出异常(java.util.NoSuchElementException: key not found:)
//println(map4("Alice~"))
if(map4.contains("zxcx")){
println("key存在,值="+map4("zxcx"))
}else{
println("key不存在")
}
println(map4.get("zxc").get) //10
println(map4.get("zxcx").get) //抛出异常
println(map4.getOrElse("zxc","是一个明星")) //10
println(map4.getOrElse("zxcc","是什么东西")) //是什么东西
val map5 = mutable.Map(("A", 1), ("B", 2), ("C","北京"))
map5("AA")=20 //不存在,就添加
println(map5) //HashMap(AA -> 20, A -> 1, B -> 2, C -> 北京)
map5("A")=100 //存在,就修改
map5.put("D",888)
println(map5) //HashMap(AA -> 20, A -> 100, B -> 2, C -> 北京)
说明: 当增加一个 key-value ,如果 key 存在就是更新,如果不存在,这是添加
map5.remove("AA")
map5-=("D","A")
println(map5)
//map的遍历
val map6 = mutable.Map(("A", 1), ("B", 100), ("C", "杭州"))
for((k,v) <- map6) println(k+" is mapped to "+v) //A is mapped to 1 ......
for(v <- map6.keys) println(v) //A B C
for(v <- map6.values) println(v) //1 100 杭州
//这样取出方式 v 类型是 Tuple2
for(v <- map6) println(v+" key="+v._1+" val="+v._2) //(A,1) key=A val=1
public class JavaHashSet {
public static void main(String[] args) {
//java 中的 Set 的元素 没有顺序,不能重复
HashSet hs = new HashSet();
hs.add("jack");
hs.add("tom");
hs.add("jack");
hs.add("jack2");
System.out.println(hs); //jack2 jack tom
}
}
Scala 中 Set 的说明
默 认 情 况 下 , Scala 使 用 的 是 不 可 变 集 合 , 如 果 你 想 使 用 可 变 集 合 , 需 要 引 用 scala.collection.mutable.Set 包
object SetDemo01 {
def main(args: Array[String]): Unit = {
val set = Set(1, 2, 4) //不可变
println(set) //Set(1, 2, 4)
val set2 = mutable.Set(1, 2, "hello") //可变
println(set2) //HashSet(1, 2, hello)
}
}
//前提是可变的
//添加
set2+=100 //方式一
set2+=(5) //方式二
set2.add("world") //方式三
println(set2) //HashSet(1, 2, world, 100, 5, hello)
//删除
set2-=2
set2.remove(100)
println(set2) //HashSet(1, world, 5, hello)
//遍历
for(item <- set2) println(item) //1 world 5 hello
object MapOperateDemo01 {
def main(args: Array[String]): Unit = {
val list1 = List(1, 2, 3, 4)
var list2 = List[Int]()
for(item <- list1){
list2 = list2:+ item*2
}
println(list2) //List(2, 4, 6, 8)
//对上面传统的方法来解决问题的小结
//1. 优点
//(1) 处理方法比较直接,好理解
//2. 缺点
// (1) 不够简洁,高效
// (2) 没有体现函数式编程特点 集合=》函数 => 新的集合 =》 函数 .. //
// (3) 不利于处理复杂的数据处理业务
}
}
object HighOrderFunDemo01 {
def main(args: Array[String]): Unit = {
//使用高阶函数
val res = test(sum2, 3.5)
println(res) //7.0
//在 scala 中,可以把一个函数直接赋给一个变量,但是不执行函数
val f1 = myPrint _
f1() //执行
}
def myPrint(): Unit = {
println("hello,world!")
}
//说明
//1. test 就是一个高阶函数
//2. f: Double => Double 表示一个函数, 该函数可以接受一个 Double,返回 Double
//3. n1: Double 普通参数
//4. f(n1) 在 test 函数中,执行 你传入的函数
def test(f:Double => Double, n1: Double)={
f(n1)
}
//普通的函数, 可以接受一个 Double,返回 Double
def sum2(d:Double):Double={
d+d
}
}
object HighOrderFunDemo02 {
def main(args: Array[String]): Unit = {
test2(sayOk)
}
//说明 test2 是一个高阶函数,可以接受一个 没有输入,返回为 Unit 的函数
def test2(f:() =>Unit)={
f()
}
def sayOk()={
println("sayOkok")
}
def sub(n1:Int)={
}
}
object MapOperateDemo02 {
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3, 4)
val list2 = list.map(multiple)
//说明 list.map(multiple) 做了什么
//1. 将 list 这个集合的元素 依次遍历
//2. 将各个元素传递给 multiple 函数 => 新 Int
//3. 将得到新 Int ,放入到一个新的集合并返回
//4. 因此 multiple 函数调用 4
println("list2="+list2) //list2=List(2, 4, 6, 8)
}
def multiple(n:Int):Int={
2*n
}
}
object MapOperateDemo02 {
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3, 4)
val list2 = list.map(multiple)
//说明 list.map(multiple) 做了什么
//1. 将 list 这个集合的元素 依次遍历
//2. 将各个元素传递给 multiple 函数 => 新 Int
//3. 将得到新 Int ,放入到一个新的集合并返回
//4. 因此 multiple 函数调用 4
println("list2="+list2) //list2=List(2, 4, 6, 8)
//深刻理解 map 映射函数的机制-模拟实现
val myList=MyList()
val myList2 = myList.map(multiple)
println("myList2="+myList2)
}
def multiple(n:Int):Int={
2*n
}
}
//深刻理解 map 映射函数的机制-模拟实现
class MyList{
val list1=List(1,2,3,4)
//新的集合
var list2 = List[Int]()
//写map
def map(f:Int => Int):List[Int]={
//遍历集合
for(item <- this.list1){
//过滤,扁平化....
list2=list2:+f(item)
}
list2
}
}
object MyList{
def apply():MyList=new MyList()
}
object Exercise01 {
def main(args: Array[String]): Unit = {
val names =List("Alice","Bob","Nick")
val name2 = names.map(upper)
println(name2) //List(ALICE, BOB, NICK)
}
def upper(s:String): String ={
s.toUpperCase
}
}
object FlatMapDemo01F {
def main(args: Array[String]): Unit = {
val names = List("Alice", "Bob", "Nick")
//需求是将 List 集合中的所有元素,进行扁平化操作,即把所有元素打散
val names2 = names.flatMap(upper)
println("names2=" + names2) //names2=List(A, L, I, C, E, B, O, B, N, I, C, K)
}
def upper(s: String): String = {
s.toUpperCase()
}
}
object FilterDemo01 {
def main(args: Array[String]): Unit = {
//选出首字母为 A 的元素
val names = List("Alice", "Bob", "Nick")
val name2 = names.filter(startA)
println(names) //List(Alice, Bob, Nick)
println(name2) //List(Alice)
}
def startA(str:String):Boolean={
str.startsWith("A")
}
}
object ReduceDemo01 {
def main(args: Array[String]): Unit = {
//使用化简的方式来计算 list 集合的和
val list=List(1,20,30,4,5)
val res = list.reduceLeft(sum)
//执行的流程分析
//步骤 1 (1 + 20)
//步骤 2 (1 + 20) + 30
//步骤 3 ((1 + 20) + 30) + 4
//步骤 4 (((1 + 20) + 30) + 4) + 5 = 60
println("res="+res) //60
}
def sum(n1:Int,n2:Int):Int={
n1+n2
}
}
object ReduceExercise01 {
def main(args: Array[String]): Unit = {
val list = List(1, 2, 3, 4, 5)
def minus(num1: Int, num2: Int): Int = {
num1 - num2
}
// (((1-2) - 3) - 4) - 5 = -13
println(list.reduceLeft(minus)) //-13
// 1 - (2 - (3 -(4 - 5))) = 3
println(list.reduceRight(minus)) //3
// reduce 等价于 reduceLeft
println(list.reduce(minus)) //-13
println(list.max)
println(list.min) //1
println("minval=" + list.reduceLeft(min)) // 1
}
//求出最小值
def min(n1: Int, n2: Int): Int = {
if (n1 > n2) n2 else n1
}
}
object FoldDemo01 {
def main(args: Array[String]): Unit = {
val list =List(2,3,4,5)
def minus(num1:Int,num2:Int):Int={
num1-num2
}
//说明
//1. 折叠的理解和化简的运行机制几乎一样. //理解 list.foldLeft(6)(minus) 理解成 list(6, 2, 3, 4,5) list.reduceLeft(minus)
//步骤 (6-2)
//步骤 ((6-2) - 3)
//步骤 (((6-2) - 3) - 4)
//步骤 ((((6-2) - 3) - 4)) - 5 = -8
println(list.foldLeft(6)(minus)) //-8
理解 list.foldRight(6)(minus) 理解成 list(2, 3, 4, 5,6) list.reduceRight(minus)
// 步骤 (5 - 6)
// 步骤 (4- (5 - 6))
// 步骤 (3 -(4- (5 - 6)))
// 步骤 2- (3 -(4- (5 - 6))) = 4
println(list.foldRight(6)(minus)) //4
}
}
在2.13.11中不推荐使用,已过时,可以直接使用flodLeft或flodRight
object FlodDemo02 {
def main(args: Array[String]): Unit = {
val list4 = List(1, 9)
def minus(num1: Int, num2: Int): Int = {
num1 - num2
}
var i6=(1/:list4)(minus) // =等价=> list4.foldLeft(1)(minus)
println(i6) //-9
var i7=(list4:\10)(minus) // list4.foldRight(10)(minus)
println(i7) //2
}
}
object ScanDemo01 {
def main(args: Array[String]): Unit = {
//普通函数
def minus(num1:Int,num2:Int):Int={
num1-num2
}
//5 (1,2,3,4,5) =>(5, 4, 2, -1, -5, -10) //Vector(5, 4, 2, -1, -5, -10)
val i8=(1 to 5).scanLeft(5)(minus) //IndexedSeq[Int]
println(i8)
//普通函数
def add( num1 : Int, num2 : Int ) : Int = {
num1 + num2
}
//(1,2,3,4,5) 5 => (20,19,17,14, 10,5)
val i9 = (1 to 5).scanRight(5)(add) //IndexedSeq[Int]
println("i9=" + i9)
}
}
object Exercise02 {
def main(args: Array[String]): Unit = {
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD"
val arrayBuffer = new ArrayBuffer[Char]()
//理解折叠的第一个传入的 arrayBuffer 含义.
sentence.foldLeft(arrayBuffer)(putArray)
println("arrayBuffer="+arrayBuffer)
}
def putArray(arr: ArrayBuffer[Char], c: Char): ArrayBuffer[Char] = {
//将 c 放入到 arr 中
arr.append(c)
arr
}
}
String sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD";
Map charCountMap =
new HashMap();
char[] cs = sentence.toCharArray();
for ( char c : cs ) {
if ( charCountMap.containsKey(c) ) {
Integer count = charCountMap.get(c);
charCountMap.put(c, count + 1);
} else {
charCountMap.put(c, 1);
}
}
System.out.println(charCountMap);
object Exercise03 {
def main(args: Array[String]): Unit = {
val sentence = "AAAAAAAAAABBBBBBBBCCCCCDDDDDDD"
val map2 = sentence.foldLeft(Map[Char, Int]())(charCount)
println("map2="+map2)
//使用可变的 map,效率更高. //1. 先创建一个可变 map,作为左折叠的第一个参数
val map3 = mutable.Map[Char,Int]()
sentence.foldLeft(map3)(charCount2)
println("map3=" + map3)
}
//使用不可变Map实现
def charCount(map:Map[Char,Int],char:Char):Map[Char,Int]={
map+(char -> (map.getOrElse(char,0)+1))
}
//使用可变Map实现
def charCount2(map:mutable.Map[Char,Int],char:Char):mutable.Map[Char,Int]={
map+=(char -> (map.getOrElse(char,0)+1))
}
}
val lines = List("atguigu han hello ", "atguigu han aaa aaa aaa ccc ddd uuu")
// 将每个单词拆分出来,并统计出现次数
val wordCountMap = lines
.flatMap(_.split("\\s+"))
.groupBy(identity)
.mapValues(_.size)
// 按出现次数降序排序
val sortedWordCount = wordCountMap.toSeq.sortBy(-_._2)
// 打印结果
sortedWordCount.foreach { case (word, count) =>
println(s"$word: $count")
}
object ZipDemo01 {
def main(args: Array[String]): Unit = {
//拉链
val list1=List(1,2,3)
val list2=List(4,5,6)
val list3=list1.zip(list2)
println(list3) //List((1,4), (2,5), (3,6))
}
}
for(item<-list3){fprint(item._1 + " " + item._2) // 取出时,按照元组的方式取出即可
object IteratorDemo01 {
def main(args: Array[String]): Unit = {
val iterator = List(1, 2, 3, 4, 5).iterator
/*
这里我们看看 iterator 的继承关系
def iterator: Iterator[A] = new AbstractIterator[A] {
var these = self
def hasNext: Boolean = !these.isEmpty
def next(): A =
if (hasNext) {
val result = these.head; these = these.tail; result
} else Iterator.empty.next()
*/
println("---------------遍历方式1---------------")
while(iterator.hasNext){
println(iterator.next())
}
println("---------------遍历方式2---------------")
for(enum<- iterator){
println(enum) //上面执行过,里面没有内容
}
}
}
object StreamDemo01 {
def main(args: Array[String]): Unit = {
//创建Stream
def numsForm(n:BigInt):Stream[BigInt] =n #::numsForm(n+1)
val stream1=numsForm(1)
println(stream1) //Stream(1, )
//取出第一个元素
println("head="+stream1.head) //head=1
println(stream1.tail) //Stream(2, )// 当对流执行 tail 操作时,就会生成一个新的数据.
println(stream1) //Stream(1, 2, )
//看一个案例
def multi(x:BigInt):BigInt={
x*x
}
println(numsForm(5).map(multi)) //Stream(25, )
}
}
object ViewDemo01 {
def main(args: Array[String]): Unit = {
def multiple(num:Int):Int={
num
}
//如果这个数,逆序后和原来数相等,就返回 true,否则返回 false
def eq(i:Int):Boolean={
i.toString.equals(i.toString.reverse)
}
//说明:没有使用View,常规方式
val viewSquares1=(1 to 100).filter(eq)
println(viewSquares1) //Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99)
//使用View完成,来完成这个问题,程序中,对集合进行 map,filter,reduce,fold...
// 你并不希望立即执行,而是在使用到结果才执行,则可以使用 view 来进行优化.
val viewSquares2=(1 to 100)
.view
.filter(eq)
println(viewSquares2) //View()
//遍历 懒加载,用的时候才会加载出来
for(item <- viewSquares2){
print(" "+item+" ") // 1 2 3 4 5 6 7 8 9 11 22 33 44 55 66 77 88 99
}
}
}
(1 to 5).foreach(println(_))
println()
(1 to 5).par.foreach(println(_))
object ParDemo02 {
def main(args: Array[String]): Unit = {
val result1 = (0 to 100).map{case _ => Thread.currentThread.getName}.distinct
val result2 = (0 to 100).par.map{case _ => Thread.currentThread.getName}.distinct
println(result1) //非并行
println("--------------------------------------------")
println(result2) //并行
}
}