Scala入门到放弃—01—概述

news/2024/10/23 7:21:10/

文章目录

    • 概述
      • 什么是是Scala?
      • 为什么要使用Scala?
    • 配置环境
      • 安装
      • 测试
    • 基本语法
      • 定义变量
      • 基本数据类型
      • lazy在Scala中的应用

概述

什么是是Scala?

https://www.scala-lang.org/

Scala combines object-oriented and functional programming in one concise, high-level language. Scala’s static types help avoid bugs in complex applications, and its JVM and JavaScript runtimes let you build high-performance systems with easy access to huge ecosystems of libraries.

Scala这个名字来源于“scalable language”,即“可伸缩的语言”。
它的设计目标随着用户的需求一起成长。
Scala可被广泛应用于各种编程任务,从编写小型的脚本到构建巨型系统,它都能胜任。

为什么要使用Scala?

大教堂指的是那种近乎完美的建筑,修建需要很长的时间,不过一旦建好,就很长时间不做变更。而市集则不同,每天都会有工作于其中的人们不断地对市集进行调整和扩展。Scala更像是市集而不是大教堂,其主要的设计目标就是让用Scala编程的人们可以对它进行扩展和定制。

  • Scala是兼容的

Scala程序会被编译成JVM字节码,它们的运行期性能通常也跟Java程序相当。同时Scala代码可以调用Java方法、访问Java字段、从Java类继承、实现Java接口。要实现这些并不需要特殊的语法,几乎所有的Scala代码都重度使用Java类库。
例如:ScalaInt是用Java的基本类型int实现的,Float是用Javafloat实现的,Boolean是用Javaboolean实现的,比如Scala的字符串字面量“abc”是一个java.lang.String,而抛出的异常也必须是java.lang.Throwable的子类。

  • Scala是简单的
    Scala编写的程序通常都比较短。对比一些大数据中WordCount 的实现;

  • Java


public static class WordCountMapper extends Mapper<LongWritable, Text,Text, IntWritable>{protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//key表示读取的行偏移量,value表示读取的行内容String[] words = value.toString().split(" ");for (String word:words) {context.write(new Text(word),new IntWritable(1));}}}public static class WordCountReducer extends Reducer<Text, IntWritable,Text, IntWritable>{protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable value:values) {sum+=value;}context.write(key,new IntWritable(sum));}}public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {Configuration conf=new Configuration();conf.set("fs.defaultFS", "hdfs://master:9000");Job job=Job.getInstance(conf);job.setJarByClass(WcJob.class);job.setMapperClass(WcMapper.class);job.setReducerClass(WcReduce.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);Path path = new Path("/wordcount/out/demo1");FileInputFormat.setInputPaths(job,new Path("/wordcount/in/hello.txt"));FileOutputFormat.setOutputPath(job,path);boolean isDone = job.waitForCompletion(true);System.exit(isDone ? 0 : 1);}
  • Scala
def main(args: Array[String]): Unit = {val lines = Array("hello word hello tim","hello java hello java","hello tim jim")val conf: SparkConf = new  SparkConf().setMaster("local[2]").setAppName(this.getClass.getSimpleName)val sc: SparkContext = new SparkContext(conf)val value = sc.textFile("in\\wc.txt")//scala实现val res1=lines.flatMap(_.split(" ")).map((_,1)).groupBy(_._1).map(x=>(x._1,x._2.size)).toList.sortBy(_._2).reverseprintln(res1)}

配置环境

安装

  1. 安装 Java 8
  2. 下载 download scala 网址:https://www.scala-lang.org/download/2.11.8.html
  3. 解压 unzip scala
  4. 配置环境变量(可选)
    Windows 需配置两个 Path中: D:\scala\binD:\scala\jre\bin

测试

Linux或Mac中操作步骤:
1.tar -zxvf scala-2.11.8.tgz -C  解压路径
2.到解压目录下 pwd  复制整个路径 
3.将上面的路径 添加到环境变量中vi ~/.bash_profileexport SCALA_HOME=复制的路径export PATH=$SCALA_HOME/bin:$Path保存source ~/.bash_profileecho $SCALA_HOME
下载之后的scala目录下的bin目录中 有普通文件 和 .bat文件
.bat文件是在Windows中用的,Linux或Mac中用不到,所以可以删掉 rm *.bat

基本语法

定义变量

Scala的变量分为两种:valvarvalJavafinal变量类似,一旦初始化就不能被重新赋值。而var则不同,类似于Java的非final变量,在整个生命周期内var可以被重新赋值。如下是val的定义:

  • val:值
final
val 值名称:类型=xx
val a = 1  (不可变)
val a : int = 1
  • var:变量
var 值名称:类型=xxx
var b = 1
var b : int = 1

val的定义中,既没有java.lang.String,也没有String。这个示例展示了Scala的类型推断(type inference)能力——能够推断出那些不显式指定的类型。在本例中,由于是用字符串字面量来初始化msgScala推断出msg的类型是String。要在解释器中分多行录入代码,只需要在第一行之后直接按回车继续就好。如果当前键入的内容不完整,解释器会自动在下一行的头部加上竖线(|)。

基本数据类型

  • Byte/Char
  • Short/Int/Long/Float/Double
  • Boolean
  • 只有Float声明时比较特别
    var c : Float = 1.1f
scala> b=20
b: Int = 20scala> val b:Int =10
b: Int = 10scala> val c:Boolean=true
c: Boolean = truescala> val d =1.1
d: Double = 1.1scala> val e:Float=1.2f
e: Float = 1.2


lazy在Scala中的应用

lazy var d : int = 1;
延迟加载,只有在第一次使用时才加载

读取文件并以字符串形式输出

	import scala.io.Source._var info = fromFile("...").mkString

如果用lazy var info = fromFile(“…”).mkString,开始是检测不到错误的,要小心使用

*注意:当一个变量声明为lazy,只有当你第一次操作时才会去真正访问,如果不去访问,即使写错了,也不会发现


http://www.ppmy.cn/news/757481.html

相关文章

企业服务管理和IT服务管理有何异同?有哪些最佳实践参考?

IT服务管理&#xff08;ITSM&#xff09;可以超越基本的IT支持范围&#xff0c;并发挥更加广泛、重要的战略作用。它的基本理念是将IT作为一种服务来提供&#xff0c;确保IT团队为客户交付端到端的IT服务。ITSM 是一种管理方法和框架&#xff0c;它应用于现代企业的每个部门&am…

丹尼带你入坑无人机3 - 四轴配件简介

知道你的四轴里面每个小东东都是干嘛用的吗&#xff1f; 麻雀虽小&#xff0c;五脏得全。简单说&#xff0c;飞控就是大脑&#xff0c;它能知道每一时刻无人机的状态&#xff0c;并且给下一时刻需要作出的动作发出指令。 电调就好比是神经单元&#xff0c;接收大脑发送的命令&…

保价拍卖规则模糊,“转转”暗藏猫腻?

来源 | 江湖老刘 作者 | IT评论员 近年来&#xff0c;二手3C市场得到井喷式发展&#xff0c;据工信部公开数据显示&#xff0c;2020年中国预计总共产生5.24亿台废旧手机&#xff1b;而从2014年至今&#xff0c;中国的二手手机存量累计超过20亿部。与此同时&#xff0c;二手手机…

胶卷相机可以中途拆电池吗_您应该购买非品牌相机电池吗?

胶卷相机可以中途拆电池吗 Batteries are dangerous—they’re practically a bomb—so you need to be careful when you buy them. Sure, they’re not likely to take down an airliner but a bad battery could definitely damage your camera. It also might not work as …

【FATE】联邦学习 optimizer在FATE的自定义trainer中被改变

起因 使用torch的optimizer添加了2组parameter&#xff0c;传参进入FATE的trainer后&#xff0c;optimizer被改变&#xff0c;且FATE框架无提示。 代码差不多是下面这样&#xff1a; # optimizer中加入2组优化参数&#xff08;param&#xff09; optimizer torch.optim.SGD…

python爬虫框架之Scrapy配置文件详解

概述 简介 配置文件是settings.py 官网配置文档 爬取的相关配置 DOWNLOAD_DELAY 下载者从同一网站下载连续页面之前应等待的时间&#xff0c;可以用来限制爬行速度 单位秒&#xff0c;支持十进制数&#xff0c;如&#xff1a;DOWNLOAD_DELAY 0.25 # 250 ms of delay D…

JMeter分布式压测连接Jenkins生成HTML报告时候报错No such file or directory

JMeter-master机器上没有该文件。从官网下载的JMeter都会有该文件&#xff0c;添加进去即可。

reeRTOS与HAL库在STM32F103上实现CANFestival从属客户端的解析与实践指南

欢迎阅读本文&#xff0c;我在这里将为大家介绍如何在FreeRTOS和HAL库的环境中在STM32F103上实现CANFestival的从属客户端。我们将详细探讨每一个步骤&#xff0c;并提供少量示例代码&#xff0c;帮助大家理解这个过程。 实战项目下载 1. 前言 在嵌入式系统的开发过程中&…