Scala---迭代器模式+Trait特质特性

Scala迭代器模式处理数据

scala中创建集合需要内存,集合与集合之间的转换时,每次转换生成新的集合时,新的集合也需要内存。如果有一个非常大的初始集合,需要经过多次转换,每次转换都生成一个新的集合,才能得到最终的结果,那么这时,在集合转换过程中内存开销非常大。Scala迭代器模式处理数据,很好的解决了内存占用大的问题。

Scala迭代器模式处理数据每次将集合的转换转变成了迭代器之间的转换,迭代器是不需要占用内存存储的,迭代器只是一个指针,指向了最初的原始数据,这样,数据处理过程中内存占用非常小。

迭代器模式处理示例:

//非迭代器模式处理,浪费内存
val list1 = List[String]("hello java","hello python","hello scala")
val list2 = list1.flatMap(one=>{one.split(" ")})
val list3 = list2.map(one=>{one+"#"})
list3.foreach(println)println("***********************")//迭代器模式处理,内存小
val list = List[String]("hello java","hello python","hello scala")
val iter1 = list.iterator
val iter2 = iter1.flatMap(one=>{one.split(" ")})
val iter3 = iter2.map(one=>{one+"#"})
while(iter3.hasNext){val one = iter3.next()println(one)}

Trait 特质特性

1、概念理解

Scala Trait(特质) 相当于java的接口,实际上它比接口还功能强大。与接口不同的是,它还可以定义属性和方法的实现。

一般情况下Scala的类可以继承多个Trait,从结果来看就是实现了多重继承。第一个关键字使用extends,之后使用with。

Trait(特质)定义的方法与类类似,但它使用的关键字是trait。

2、举例:trait中带属性带方法实现

注意:

继承的多个trait中如果有同名的方法和属性,必须使用“override”重新定义。

2、trait中不可以传参数

trait Read {val readType = "Read"val gender = "m"def read(name:String){println(name+" is reading")}
}trait Listen {val listenType = "Listen"val gender = "m"def listen(name:String){println(name + " is listenning")}
}class Person() extends Read with Listen {override val gender = "f"
}object test {def main(args: Array[String]): Unit = {val person = new Person()person.read("lisi")person.listen("zhangsan")println(person.listenType)println(person.readType)println(person.gender)}}

3、举例:trait中带方法不实现

1.object Lesson_Trait2 {
2.  def main(args: Array[String]): Unit = {
3.    val p1 = new Point(1,2)
4.    val p2 = new Point(1,3)
5.    println(p1.isEqule(p2))
6.    println(p1.isNotEqule(p2))
7.  }
8.}
9.
10.trait Equle{
11.  def isEqule(x:Any) :Boolean 
12.  def isNotEqule(x : Any) = {
13.     !isEqule(x)
14.  }
15.}
16.
17.class Point(x:Int, y:Int) extends Equle {
18.  val xx = x
19.  val yy = y
20.
21.  def isEqule(p:Any) = {
22.    p.isInstanceOf[Point] && p.asInstanceOf[Point].xx==xx
23.  }
24.
25.}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sqlite3简单使用

为什么要使用sqlite3? sqlite3轻量简介,无需单独的数据库服务,只需访问磁盘上的.db的文件。在某些情况下很有用。 下面是一些简单的使用代码: import sqlite3 from uuid import uuid1# 连接数据库文件,如果不存在会创建 with…

2023年中国冲击波治疗仪市场发展趋势分析:未来市场增长空间更大[图]

冲击波在临床医学领域最早应用于体外冲击波碎石,在二十世纪八十年代末期,体外冲击波碎石技术开始被运用到骨科及康复理疗领域,经过十余年的临床研究,冲击波疗法日益完善,应用范围也日益扩大。冲击波作为一种介于保守疗…

【入门篇】1.7 Redis 之 codis 入门介绍

文章目录 1. 简介2. Codis的安装与配置下载编译源码安装1. 安装 Go 运行环境2. 设置编译环境3. 下载 Codis 源代码4. 编译 Codis 源代码 Docker 部署 3. Codis的架构Codis的架构图和组件Codis的工作流程 4. Codis的核心特性自动数据分片数据迁移高可用性全面支持Redis命令分布式…

Android中eBPF使用原理以及 kprobe dmabuf_setup实例

目录 eBPF in Android Android eBPF kprobe dma代码 定义一个MAP 定义一个 PROG bpfprogs/Android.bp 测试程序 bpfprogs/memstats/Android.bp bpfprogs/memstats/MemStats.h bpfprogs/memstats/MemStats.cpp bpfprogs/memstats/MemStatsMain.cpp 编译运行 结果分析…

android 13.0 删除连接wifi的配置信息

1.前言 在13.0的系统rom产品定制化开发中,对于wifi的功能定制需求功能也是挺多的,目前对于wifi模块有这么个需求,要求在 提供接口实现删除已连接wifi的需求,所以需要了解wifi相关的配置情况,然后移除wifi即可,接下来就来实现相关的功能 2.删除连接wifi的配置信息的核心类…

C 语言 sizeof运算符

C 语言 sizeof运算符 sizeof运算符在C语言中使用时,它决定表达式的大小或在char大小的存储单元数量中指定的数据类型。sizeof运算符包含一个操作数,该操作数可以是表达式,也可以是数据类型转换,其中转换是用括号括起来的数据类型…

【fbtft】如何添加fbtft驱动

获取lcd ic的datasheet,或者直接找到其他平台(linux,stm32,esp32)的驱动 我用的是合宙的esp32驱动,注意是c语言的,合宙上层用lua封装了,需要找到sdk源码。 源码路径: …

File类和IO流

我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…

设置chunk自动扩展到多大

1. 设置chunk自动扩展 execute function task(modify chunk extendable on,8); 2. 设置dbs扩展到多大合适 execute function task(modify space sp sizes,testdb1024,1024,10240) testdb 初始1MB 下次扩1MB 最大10MB

appium+python自动化测试

获取APP的包名 1、aapt即Android Asset Packaging Tool,在SDK的build-tools目录下。该工具可以查看apk包名和launcherActivity 2、在android-sdk里面双击SDK-manager,下载buidl-tools 3、勾选build-tools,随便选一个版本,我这里选的是24的版…

宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三)

来源:宏集科技 工业物联网 宏集干货 | 手把手教你通过CODESYS V3进行PLC编程(三) 教程背景 通过之前的教程,我们已经为大家演示了宏集MC-Prime控制器的连接、试运行和CODESYS的安装,并创建了一个计数器项目。在本期教…

数据分析 - 分散性与变异的量度

全距 - 极差 处理变异性 方差度量 数值与均值的距离,也就是数据的差异性 标准差描述:典型值 和 均值的距离的方法,数据与均值的分散情况

出行类app如何提升广告变现收益?

出行类APP已经成为越来越多人们出行的首选,出行类app在变现方式上存在以下痛点:APP功能单一、使用场景单一;用户使用时间集中,粘性低...这些痛点使得开发者获取收益的提升面临极大的挑战。 https://www.shenshiads.com 如何让出…

事实 读书笔记

事实 这本书目标是想突破人类的一些本能的直觉惯性,让我们能更加客观的认识这个世界,让我们不显得那么无知。 主体内容以一些直觉陷阱一步一步的展开 二元论 作者认为我们很容易通过简单的对立关系来理解世界,如把这个世界理解为发展中国家…

【ARL灯塔搭建详细教程】

文章目录 前言一、前期准备二、安装docker及docker-compose三、安装ARL灯塔四、登录ARL灯塔 前言 ARL(Asset Reconnaissance Lighthouse)资产侦查灯塔旨在快速发现并整理企业外网资产并为资产构建基础数据库,无需登录凭证或特殊访问即可主动…

Python ... takes 0 positional arguments but 1 was given

最近,博主在学习python时遇到这么个报错, 系统:windows10 开发环境:VS Code Python版本:3.12 错误重现: class Dog:def __init__(self):passdef eatSomething(self):self.eatBone()def eatBone():prin…

Ubuntu18.04安装Loam保姆级教程

系统环境:Ubuntu18.04.6 LTS 1.Loam的安装前要求: 1.1 ROS安装:参考我的另一篇博客 Ubuntu18.04安装ROS-melodic保姆级教程_灬杨三岁灬的博客-CSDN博客还是那句话,有时候加了这行也不好使,我是疯狂试了20次&#xf…

quartz笔记

Quartz-CSDN博客 上面是Quartz的一些基本知识,如果对quartz的基本API不是很了解的话,建议先看下上面的 和Linux Crontab对比 1.执行粒度: Linux Crontab是进程级 quart是线程级 2.跨平台性: Crontab只能在Linxu运行 quart是java实现,可以跨平台 3.调度集上 Crontab的…

VUE指令、computed计算属性和watch 侦听器(附带详细案例)

文章目录 前言一、指令补充1. 指令修饰符2. v-bind对于样式操作的增强 - class3. 案例 - 京东秒杀 tab 导航高亮4. v-bind对于样式操作的增强 - style5. v-model应用于其他表单元素 二、computed计算属性1. 基础语法2. 计算属性 vS method 方法3. 完整写法4. 成绩案例 三、watc…

Java读取本地文件

import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException;public class Main {public static void main(String[] args) {String filePath "C:/Users/admin/Desktop/知识点记录.md";// 创建一个文件对象File f…