展开

关键词

程序里怎么表达“没有”

如果想表达“没有”,就只能用对应数据类型默认值,比如,字符串默认值是"",整数是0,布尔类型是false。在团队里展开了一个讨论——程序里要不要表达“没有”,和怎么表达“没有”。 开发者还是要去检查这个东西到底有没有,无论是用if + null,还是用Optional#ifPresent,都是一样。要做好检查,就要求开发者有这个意识去做这个检查。 应该承认使用Optional时对开发者做检查推动力是要强过if + null式检查,并且还很“类型”,但从使用角度整体性价比还是很差。 对此我鼓励所有的静态类型语言开发者都要至少尝试写一种动态代码,吸收一些编译器搞不定情况下如何避免出问题思路和习惯。现实开发中总有编译器无法防范问题。 而动态语言,当然就做运行时检查了。 对于此问题,最好办法不是干掉“没有”,而是想方设法让开发者尽可能方便和灵活检查null,尽量避免不检查带来问题。

34320

Scala入门笔记

例如,Scala每个值都是一个对象,包括基本数据类型(即布尔值、数字等)在内,连函数也是对象。 类型安全: Scala创始人是教授,他先带领创建了java 5编译器,而后觉得Java有太多羁绊而发明了ScalaScala编译器类型系统非常强大,它目标是尽量把软件错误消灭在编写过程中。 Scala类型系统是图灵完备,甚至可以在编译期间解决问题。 面向对象: Scala是面向对象编程语言,所有的变量和方法都封装在对象中,可以把信息封装起来供外部使用。 静态类型: Scala是具备类型系统,通过编译时检查,保证代码安全性和一致性。 比如使用foreach方法来实现循环,如下: args.foreach(arg => println(arg)) 该表达式,调用argsforeach方法,传入一个参数,这个参数类型也是一个函数(lambda

34770
  • 广告
    关闭

    开发者专享福利,1988元优惠券限量发放

    带你体验博客、网盘相册搭建部署、视频渲染、模型训练及语音、文字识别等热门场景。云服务器低至65元/年,GPU15元起

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Scala入门

    例如,Scala每个值都是一个对象,包括基本数据类型(即布尔值、数字等)在内,连函数也是对象。 类型安全: Scala创始人是教授,他先带领创建了java 5编译器,而后觉得Java有太多羁绊而发明了ScalaScala编译器类型系统非常强大,它目标是尽量把软件错误消灭在编写过程中。 Scala类型系统是图灵完备,甚至可以在编译期间解决问题。 面向对象: Scala是面向对象编程语言,所有的变量和方法都封装在对象中,可以把信息封装起来供外部使用。 静态类型: Scala是具备类型系统,通过编译时检查,保证代码安全性和一致性。 比如使用foreach方法来实现循环,如下: args.foreach(arg => println(arg)) 该表达式,调用argsforeach方法,传入一个参数,这个参数类型也是一个函数(lambda

    34870

    Scala 学习笔记之基础语法

    条件表达式 Scala if/else 语法结构和Java一样.不过,在Scala中 if/else 表达式有值,这个值就是跟在 if 或 else 之后表达式值: if(x > 0) 1 备注 Scala中每个表达式都有一个类型 scala> val s = if(x > 0) "positive" else -1; s: Any = positive 上述表达式类型是两个分支类型公共超类型 ;检查变量是否满足某条件;更新变量)循环直接对应结构.如果你需要这样循环,有两个选择:一是选择while循环,二是使用如下for语句: for(i <- 1 to n){ println("num ->" + i) } 上述表达式目标是让变量i遍历<-右边表达式所有值.至于如何遍历,则取决于表达式类型. .Scala编译器可以通过=符号右侧表达式类型推断出返回类型

    17810

    Scala第三章学习笔记

    解决办法:加一条新编码规定,要求所有的方法定义使用"="语法。 特质是线性化,所以如果想要使用覆盖方法,可以在实例化对象时候混入父类,而不需要定义新类。 注解优化 @tailrec @switch注解 使用@switch注解 ? 编译器给出了警告语句。因为模式匹配无法优化,编译不过。 JVM本身不支持,所以依赖于Scala编译器来执行优化。 要优化尾递归调用,Scala编译器需要以下条件。 (1)方法必须是final或私有。方法不能多态。 (2)方法必须注明返回类型。 (3)方法必须在其某个分支最后一句调用自身。 广度优先搜索算法是搜索图或树一种算法:先检查顶层元素,然后是这些元素最近邻居,然后是最近邻居最近邻居,据此类推,直到找到你想要元素。

    21310

    追随 KotlinScala,看 Java 12-15 现代语言特性

    相当于只支持值匹配 Kotlin when 表达式/Scala match 表达式。 ) obj).length()); } 而使用模式匹配之后,可以在判断成功时绑定为一个对应类型变量,之后直接使用该变量即可: if (obj instanceof String s) { System.out.println // System.out.println(s.length()); } instanceof 模式匹配不仅能用于 if 语句中,还可以用于 while 语句、三目运算符以及 &&、|| 等能使用布尔逻辑地方 permits 显式声明其直接子类型列表,也可以省略——编译器会根据当前文件中直接子类型声明推断出来。 小结 Java 12-15 引入了 switch 表达式、文本块、instanceof 模式匹配、记录、密封类型这几个语言新特性,这些特性在 Kotlin/Scala 中基本上都有对应,如同 Java

    25120

    小朋友好好学学lambda表达式吧!

    [这就有点不够纯粹了,比scala还是差了点!],参数前可以加类型名,但由于自动类型推导功能,可以省去。 表达式可以是一行表达式,也可以是多条语句。如果是多条语句,需要包裹在大括号{}中。 @FunctionalInterface注解不是必须,但建议最好加上,这样可以通过编译器检查接口中是否仅存在一个抽象方法。 Lambda表达式本质就是函数式接口匿名实现。 对类型T进行了一元操作,仍返回类型T BinaryOperator T,T T apply 对类型T进行了二元操作,仍返回类型T Predicate T void test 对类型T进行函数处理,返回布尔值 BiPredicate<T,U> T,U void test 对类型T和U进行函数处理,返回布尔值 从中可以看出: 内置函数式接口主要分四类:Supplier, Consumer, Function 于是Java8设计人员就想出了这个办法:在接口中新增加一个方法类型,叫默认方法,可以提供默认方法实现,这样实现类如果不实现方法的话,可以默认使用默认方法中实现。

    7220

    Scala学习笔记之二--基本数据类型

    前言 本篇主要讲Scala基本数据类型,更多教程请参考:Scala教程 基本数据类型 Scala一共提供了9中数据类型Scala基本数据类型与java中基本数据类型是一一对应,这是Scala res0:Int = 41 浮点型变量定义: //Double类型定义,直接输入浮点数,编译器会将其自动推断为Double类型 scala> val doubleNumber = 3.1415 doubleNumber \ \b \\, I an 布尔类型定义: scala>var x = true x:Boolean = true Scala基本类型操作 因为Scala中一切皆对象,这意味着Scala一切操作都是对象方法 不过,在Scala中if/else表达式有值,这个值就是跟在if或者else之后表达式值。 此时这个表达式类型是公共超类型Any。

    37650

    第2章 Kotlin 语法基础第2章 Kotlin 语法基础

    a = 1 // 根据值 1 编译器能够自动推断出 `Int` 类型 >>> a 1 用val声明变量不能重新赋值 >>> val a = 1 >>> a++ error: val cannot be 1: 0这样三元表达式。对应写法是使用if else语句: if(true) 1 else 0 if-else语句规则: if后括号不能省略,括号里表达式值须是布尔型。 在这里,Kotlin跟Scala在大括号使用上,是完全不同。 然后,调用函数方式是直接调用invoke()函数:sumf(1,1).invoke()。 2.3.8 throw表达式 在 Kotlin 中 throw 是表达式,它类型是特殊类型 Nothing。 该类型没有值。跟C、Java中void 意思一样。 b) a /= b a.divAssign(b) a %= b a.modAssign(b) 对于赋值操作,例如 a += b,编译器会试着生成 a = a + b 代码(这里包含类型检查:a +

    34620

    SparkSql优化器-Catalyst

    对于后者,我们使用另一个scala特性,quasiquotes,使得在运行过程中从组合表达式产生代码更简单。最后,Catalyst提供一些公共扩展点,包括外部数据源和用户自定义类型。 每个批次后,开发人员还可以在新树上进行合理检查(例如,看看是否所有属性都是分配类型了),通常也通过递归匹配来编写。 最后,规则条件及其本身可以包含任意Scala代码。 我们使用Catalyst将表示SQL中表达式树转换为Scala代码AST,以评估该表达式,然后编译并运行生成代码。 Quasiquotes在编译时进行类型检查,以确保仅替换适当AST或literals ,使其比字符串连接更可用,并且它们直接生成Scala AST,而不是在运行时运行Scala解析器。 此外,它们是高度可组合,因为每个节点代码生成规则不需要知道如何构建其子节点返回树。最后,Scala编译器进一步优化了最终代码,以防止Catalyst错过了表达式优化。

    98790

    Scala语言学习笔记一

    scala ,验证方法是直接执行 $ scala 如果进入scala交互界面则配置正确,否则检查$PATH变量,如果采用了brew安装,可以用 $ brew install scala 来进行安装,我这里采用版本是 * res0 res1: Double = 5.0 类型支持自动转换,如果手工调用方法可以使用Tab键,这也是scala交互式学习优势 scala> res1.to[Tab] Scala解释过程实际上是把代码转换成字节码 2.11.8/#package 2 控制结构和函数 2.1 if条件表达式 Scalaif表达式和Java类似,但是Scalaif/else表达式可以跟着值,也可以赋值给变量 scala> val for循环比较特殊没有c(i=0;i<10;i++)方式,但是Scala 有特殊for 写法 for ( i <- 表达式 ) scala > for ( i <- 1 to 10 ) 函数定义举例:def abs(x: Double) = if ( x >=0 ) x else -x 特别注意是递归函数,必须要指定返回类型,否则编译器无法校验 def fac(n: Int

    48740

    Scala第二章节

    字符串 4.1 使用双引号 4.2 使用插值表达式 4.3 使用三引号 4.4 扩展: 惰性赋值 5. 标识符 5.1 概述 5.2 命名规则 5.3 命名规范 6. Scala常量 2.1 概述 常量指的是: 在程序运行过程中, 其值不能发生改变量. 2.2 分类 字面值常量(常用有以下几种) 整型常量 浮点型常量 字符常量 字符串常量 布尔常量 使用双引号 使用插值表达式 使用三引号 4.1 使用双引号 语法 val/var 变量名 = “字符串” 示例 有一个人名字叫"hadoop",请打印他名字以及名字长度。 参考代码 scala> println(name + name.length) hadoop6 4.2 使用插值表达式 scala中,可以使用插值表达式来定义字符串,有效避免大量字符串拼接。 NOTE] scala中所有的类型使用大写字母开头 整形使用Int而不是Integer scala中定义变量可以不写类型,让scala编译器自动推断 Scala中默认整型是Int, 默认浮点型是

    16320

    scala 学习笔记

    Scala可以如动态语言似的编写代码,但又有静态语言编译时检查。这对于Java中冗长、重复类型声明来说是一种很好进步。 注:在RELP中,val变量是可以重新赋值,这是`RELP`特性。 编译器在编译时将自动决定使用原生类型还是装箱类型。 字符串 Scala字符串有3种。 分别是普通字符串,它特性和Java字符串一致。 ,if语句也是有返回值,将表达式结果赋给变量,编译器也能正常推导出变量类型。 unit和unit2变量类型是Any,这是因为else语句缺失,Scala编译器就按最大化类型来推导,而Any类型Scala类型。 且对应case语句表达式值将作为整个match case表达式值返回。 集合 在Scala中,常用集合类型有:List、Set、Map、Tuple、Vector等。

    10920

    Null 值及其处理方式

    使用了 nullptr 则可以解决这个问题,由于 nullptr 类型是一个特殊类型,并且可以被隐式转换为任意指针类型,所以编译器可以准确地选择 Foo* 版本。 = null) b.length else -1 这是一个类型收窄,在 if 表达式对 b 进行判断之前,b 是可空 String,但在判断之后,编译器可以根据这个判断确定在这里 b 不可能为 null 但编译器通过一个表达式来进行对可空类型特殊处理,总觉得是一个比较怪异事情,怪异点在于这仅仅支持最简单情形,稍微复杂一点就不行了,让人觉得失去了统一性,例如在 Kotlin 中,这样代码是非法 它们使用参数化类型来表示 null 这个概念。例如在 Scala 中,有一个 Option[T] 8 类型,对于一个可能为空对象,不将其类型设置为 T 而是设置为 Option[T]。 ,这里类型匹配相当于对一个对象进行了类型判断,并将类型转换为指定类型,不需要编译器对某个表达式进行特化分析就保证了类型安全。

    26340

    挑逗 Java 程序员那些 Scala 绝技

    容易导致错误代码 下面是一段检查用户是否存在 Java 代码。 ? 请仔细观察上述代码,你能一眼看出问题所在吗? 这种类型错误在 Java 中非常容易发生,因为 getCurrentUserId() 方法很可能因为重构而改变了返回类型,而 Java 编译器却在关键时刻背叛了你,没有报告任何编译错误。 在使用伴生对象方法创建实例时可以省略方法名 apply,例如。 ? 在这个例子里,使用伴生对象方法实例化对象代码,与上面使用类构造器代码完全一样,编译器会优先选择伴生对象 apply 方法。 一个整数加法解释器 我们首先定义基本表达式类型。 ? 上面定义了两个表达式类型,Number 表示一个整数表达式, PlusExpr 表示一个加法表达式。 在不同库间实现无缝对接 当传入参数类型和目标类型不匹配时,编译器会尝试隐式转换。利用这个功能,我们将已有的数据类型无缝对接到三方库上。

    22620

    Flink 开发生产问题汇总,亲自解决才是最宝贵

    版本冲突 java.lang.NoSuchMethodError:scala.collection.immutable.HashSet$.empty()Lscala/collection/ 解决办法, 添加 import org.apache.flink.api.scala._ 6、没有使用回撤流报错 Table is not an append一only table. slot 槽位够不够或者 slot 分配数量有没有生效 程序起并行是否都正常分配了(会有这样情况出现,假如 5 个并行,但是只有 2 个在几点上生效了,另外 3 个没有数据流动) 检查flink 程序有没有数据倾斜,可以通过 flink ui 界面查看每个分区子节点处理数据量 8、解析返回值类型失败报错 The return type of function could not be determined lambda 表达式没有明确返回值类型,或者使用特使数据结构 flink 无法解析其类型,这时候我们需要在方法后面添加返回值类型,比如字符串 input.flatMap((Integer number

    1.2K10

    Scala Turtuial-基本语法

    入门 在详细讲解Scala基本特性之前,我们需要搭建Scala开发环境和编译环境,基本语法推荐大家使用scala自带交互式环境来学习,随着学习深入和代码量大增多,后续可以选择Idea、Eclipse scala> var test:String = _ test: String = null lazy变量 lazy修饰变量只有在使用时才会被复制,lazy变量只能修饰不可变变量。 scala> lazy val test="brian lv" test: String = <lazy> scala> test res1: String = brian lv lazy修饰变量,在定义该变量时并没有赋值而是在使用时进行赋值 32位浮点数 8.Double 64位浮点数 9.Boolean 布尔型 基本数据类型使用原则: 直接输入浮点数,scala编译器会自动进行类型推导并自动解释成Double类型;如果需要定义为Float for(i<-表达式){} scala> for(i<-1 to 5) println("i==="+i) i===1 i===2 i===3 i===4 i===5 <em>scala</em>> for(i<-1 until

    39240

    ScalaScala高级使用技巧之三

    1、Scala注解支持 我们Scala编译器编译时,在碰到注解时候,会做一些特殊操作。 例如@BeanProperty注解,给某个field添加了这个注解之后,Scala编译器就会给field编译出新JavaBean风格getter和setter方法 (1)添加注解 Scala中, 所以这样子做呢,是一种轻量级多线程并发访问控制办法。但是也不是完全没有问题,还是有可能会出现错误风险。 (4)@native 标注用c实现本地方法。 (5)@throws(classOf[Exception]) def test() {} 让编译器提示类型转换警告。 scala.xml.Elem类型label属性返回是标签名,child属性返回是子元素。 scala.xml.NodeSeq类型是一个元素序列,可以用for循环直接遍历它。

    12820

    Scala高级使用技巧之三

    1、Scala注解支持 我们Scala编译器编译时,在碰到注解时候,会做一些特殊操作。 例如@BeanProperty注解,给某个field添加了这个注解之后,Scala编译器就会给field编译出新JavaBean风格getter和setter方法 (1)添加注解 Scala中, 所以这样子做呢,是一种轻量级多线程并发访问控制办法。但是也不是完全没有问题,还是有可能会出现错误风险。 (4)@native 标注用c实现本地方法。 (5)@throws(classOf[Exception]) def test() {} 让编译器提示类型转换警告。 scala.xml.Elem类型label属性返回是标签名,child属性返回是子元素。 scala.xml.NodeSeq类型是一个元素序列,可以用for循环直接遍历它。

    32161

    扫码关注腾讯云开发者

    领取腾讯云代金券