首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

挑逗 Java 程序员的那些 Scala 绝技

个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言;而另外一些 Java 开发者却对它望而却步,认为它过于复杂而难以理解。...,如果显式声明了 userId 的类型,虽然还是可以正常通过编译,但是在代码审查时,这个错误将会更容易被发现。...这种类型错误在 Java 中非常容易发生,因为 getCurrentUserId() 方法很可能因为重构而改变了返回类型,而 Java 编译器却在关键时刻背叛了你,没有报告任何的编译错误。...如果 Scala编译时发现了错误,在报错之前,会先对错误代码应用隐式转换规则,如果在应用规则之后可以使得其通过编译,则表示成功地完成了一次隐式转换。...在不同的库间实现无缝对接 当传入的参数类型和目标类型匹配时,编译器会尝试隐式转换。利用这个功能,我们将已有的数据类型无缝对接到三方库上。

2K70

协变、逆变与不变

这段代码显然错了,看一下刚刚做了什么。...事实上,这段代码可以编译通过,Java 并不会因此报编译错误,而是在运行 persons[0] = new Teacher(); 时抛出一个 java.lang.ArrayStoreException。...这个错误本来应该由编译器发现并指出,但 Java 将对这一错误的防止延后到了运行时期,错过了编译期的检查。编译器没有做正确的事情,这显然是一个设计错误,但这个错误其历史原因的 2。...这段代码中 getStudentName 要求一个 Student => String 类型的函数作为参数,而 personNameReader 函数的类型是 Person => String。...在 Scala 中,如果进行了协变或者逆变的标记,编译器就会对这个类型参数的使用进行检查,如果它出现在了错误的位置上,编译器就会提示错误,防止了开发者因此而犯错。

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

挑逗 Java 程序员的那些 Scala 绝技

个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言;而另外一些 Java 开发者却对它望而却步,认为它过于复杂而难以理解。...Java 的优势在于它的类型可读性,如果显式声明了 userId 的类型,虽然还是可以正常通过编译,但是在代码审查时,这个错误将会更容易被发现。...而在 Scala 中使用模式匹配可以很容易地解决这个问题,下面的代码演示货币类型匹配。 ? 我们也可以进行一些复杂的匹配,并且在匹配时可以增加 if 判断。 ?...如果 Scala编译时发现了错误,在报错之前,会先对错误代码应用隐式转换规则,如果在应用规则之后可以使得其通过编译,则表示成功地完成了一次隐式转换。...在不同的库间实现无缝对接 当传入的参数类型和目标类型匹配时,编译器会尝试隐式转换。利用这个功能,我们将已有的数据类型无缝对接到三方库上。

98720

挑逗 Java 程序员的那些 Scala 绝技

来源:http://t.cn/E2Fz6HW 类型推断 字符串增强 集合操作 优雅的值对象 模式匹配 并发编程 声明式编程 面向表达式编程 隐式参数和隐式转换 小结 ---- 个问题一直困扰着 Scala...,如果显式声明了 userId 的类型,虽然还是可以正常通过编译,但是在代码审查时,这个错误将会更容易被发现。...这种类型错误在 Java 中非常容易发生,因为 getCurrentUserId() 方法很可能因为重构而改变了返回类型,而 Java 编译器却在关键时刻背叛了你,没有报告任何的编译错误。...如果 Scala编译时发现了错误,在报错之前,会先对错误代码应用隐式转换规则,如果在应用规则之后可以使得其通过编译,则表示成功地完成了一次隐式转换。...在不同的库间实现无缝对接 当传入的参数类型和目标类型匹配时,编译器会尝试隐式转换。利用这个功能,我们将已有的数据类型无缝对接到三方库上。

1.5K60

多面编程语言Scala

这段代码以下值得注意的地方: 我们可以把字段定义和构造函数直接写在Scala的类定义里,其中,关键字val的含义是“不可变”,var 为“可变”,Scala的惯用法是优先考虑val,因为这更 贴近函数式编程风格...让我们来解释一下具体思路: 这段代码里面,特质通过with混入实例,如:new Programmer with Scalaist。当然,特质也可以混入类中; 为什么信息可以传递呢?...集合类型 Scala常用集合类型Array、Set、Map、Tuple和List等。...看得出来,不全函数同样可以提升代码的简洁程度,比如本例代码中,参数Array(1.0f, 2.3f, 4.5f)是固定 变的,我们就不用每次都在调用cycle2时传入它,可以 先定义c22,再用c22...此外,Scala的模式匹配还有更多用法,如case类匹配、option类型匹配,同时还能带入变量,匹配各种集合类型。综合运用模式匹配,能够极大提升开发效率。

2.5K40

Scala trait特质 深入理解

换言之,当混入的多个特质中,分别定义了同名的方法,那么Scala编译报错。...可能你疑惑了,为什么不能够让多个接口都创建同名的默认方法,让一个类来实现它们,调用同名方法,就想这样:class AA implements CC, DD,遗憾的是(高兴的是?)...// Error:(25, 1) java: 类 AA从类型 CC 和 DD 中继承了f() 的不相关默认值 要解决这个错误,要么,让其中一个接口中的同名方法改名,要么,实现类重写这个方法。...转化为类图应该要满足如下的情形: 可能有些人疑惑,为什么特质继承自任何其他的类的时候,依然可以被混入到其他的类中,就像如下的形式: trait T1 {} class Animal {}...class Dog extends Animal with T1 {} 因为在Scala任何的非值类(或特质)默认的继承了scala.AnyRef类!

24620

Scala代码编写中常见的十大陷阱

很多Java开发者在学习Scala语言的时候,往往觉得Scala的语法和用法有些过于复杂,充满语法糖,太“甜”了。在使用Scala编写代码时,由于语法和编写习惯的不同,很多开发者会犯相同或相似的错误。...比如: val xml= 这段代码真正的意思是: val xml.$equal$less(root)....Scala编译器和库代码常使用私有值的别名和缩写,反之公有的getters和setters则使用fullyCamelNamingConventions(一种命名规范)。...用法错误 忘记类型擦除(type erasure)。当你声明了一个类C[A]、一个泛型T[A]或者一个函数或者方法m[A]后,A在运行时并不存在。...这意味着,对于实例来讲,任何参数都将被编译成AnyRef,即使编译器能够保证在编译过程中类型不会被忽略掉。 这也意味着在编译时你不能使用类型参数A。

1K50

13.10 Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition13.10 Scala中使用JSON.t

Java可变长参数的方法重载 在Java代码中,我们是推荐带有变长参数的方法重载的。这样的代码调用人类阅读起来会感到“模糊”。...,这些基本规则需要牢记,但是即使记住了这些规则,仍然可能出现错误,我们来看如下代码: public class Client { //简单折扣计算 public void...现在的问题是编译为什么会首先根据2个int类型的实参而不是1个int类型、1个int数组类型的实参来查找方法呢?...有时如果不止一个最符合的版本;这种情况下编译器会给你一个“ambiguous reference to overloaded definition”(模糊引用了重载定义的方法)的错误。...解决方案: 在scala代码中显式调用:toJSONString(Object object, SerializerFeature... features) 。 另外,推荐带有变长参数的方法重载。

80830

大数据分析工程师面试集锦2-Scala

为什么要考察Scala?...当函数的参数个数多个,或者固定的时候,可以使用vararg参数,具体的使用方式是在参数类型后面加一个“*”,相应的参数在函数体中就是一个集合,根据需要对参数进行解析。...Scala在JVM上编译运行的时候需要与JDK以及其他Java库进行交互,这部分的交互就会涉及到Scala和Java集合之间转换,默认情况下这两个集合是兼容的,所以在代码中需要增加如下命令: 1)import...Either可以提供一些计算失败的信息,Either两种可能返回类型:预期/正确/成功的 或 错误的信息。...如要要对一段代码的执行进行异常检测,使用try将这段代码包起来,在catch语句中进行异常的匹配,借用了模式匹配的思想catch语句中是一系列的case字句。

2K20

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

当然如果只能这样用,那还称不上 switch 表达式,既然是表达式那么一定可以一个返回值。...文本块中的少于连续三个的双引号都无需转义,这也是文本块的用途之一,例如: System.out.println(""" This is a string literal in Java: "Hello"."""); 这段代码会输出...在没有记录类型之前,创建一个具有各字段对应 getter、为所有字段初始化的构造函数、基于所有字段的 equals()/hashCode()/toString() 的简单类却需要写一大堆代码,其中大部分都是样板代码...,除了类名、字段类型与字段名之外,其他的全部都是样板代码。...permits 显式声明其直接子类型列表,也可以省略——编译器会根据当前文件中的直接子类型的声明推断出来。

1.3K20

Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition问题描述:原因分析:解决方案:

Java可变长参数的方法重载 在Java代码中,我们是推荐带有变长参数的方法重载的。这样的代码调用人类阅读起来会感到“模糊”。...,这些基本规则需要牢记,但是即使记住了这些规则,仍然可能出现错误,我们来看如下代码: public class Client { //简单折扣计算 public void...现在的问题是编译为什么会首先根据2个int类型的实参而不是1个int类型、1个int数组类型的实参来查找方法呢?...有时如果不止一个最符合的版本;这种情况下编译器会给你一个“ambiguous reference to overloaded definition”(模糊引用了重载定义的方法)的错误。...解决方案: 在scala代码中显式调用:toJSONString(Object object, SerializerFeature... features) 。 另外,推荐带有变长参数的方法重载。

1.6K50

少年:Scala 学一下

当我还没有入门,还分不清var val def的区别时,使用scala的 REPL 用 def 定义关联到一段代码块,惊奇的发现,没有执行这段代码,但编译器已经知道(推断出)结果类型,太特么神奇了 不少讲解某些专题...那么scala语言为什么要支持这个特征呢?...强大的模式匹配 scala中的match让你爽翻天 match 是数据处理的利器,极其方便,并且大量消除样板式代码 但是这个名字并没有完全表达出这个功能的全部含义,我理解这个名称包含了三个功能:匹、配、...抽 但是由于Java虚拟机,自身类型擦除的限制,在一定程度上影响了模式匹配全部功能的完全发挥 另外,模式匹配,不仅可以通过关键字match case进行体现。...学习 Scala 概述 主要说了下Scala语言的由来,环境的搭建,以及简单的scala代码底层对应*.class 文件反编译后结构。

70510

Scala中的语言特性是如何实现的?

同样,我们可以把这段代码编译为CIL,然后反编译为C#: image.png 和Java代码大同小异,除了静态构造和某几个关键字外,基本一样。...这段Scala代码: image.png 定义了两个字段一个var,一个val,方法中定义了两个局部变量,一个var,一个val。...再来看这段Scala编译为CIL再反编译为C#之后的样子: image.png 一个明显的问题,v2没有标为readonly(C#世界中用于声明变量不可以重新赋值的关键字),这是compiler的bug...结果还是有意外收获,我在反编译后的代码中发现了三个有趣的问题: 在Scala中被声明为val的v4为什么在反编译的Java中不是final的呢?...在Scala中被声明为val的v2为什么在反编译的C#中不是readonly的呢? 为什么编译出来的C#代码中的实例级公开方法都是标有override的呢? 为什么呢?为什么呢?为什么呢?

1K70

hello Kotlin

因为这段代码是 inline 的,最终编译时是要编译到调用它的代码块中,这时候T的类型实际上是确定的,因而 Kotlin 通过 reified 这个关键字告诉编译器,T 这个参数可不只是个摆设,我要把它当实际类型来用呢...通常我们需要执行一段异步的代码,我们会构造一个 Runnable 对象,然后交给 executor,比如这段 java 代码: ? 用 Kotlin 怎么写呢?...Scala 的模式匹配才真正犀利——Kotlin 当中也有这样的特性,我们下面就来看个例子: ?...当然有人会说我们应当 proguard 做混淆,我想说的是,proguard 自然是要用到的,不过那是 SDK 这个产品加工的下一个环节了,我们为什么不能在代码级别把这个事情做好呢?...Kotlin 办法可以解决这个问题,那就是 DSL 了。下面给出一个例子: ? 一个 LinearLayou t包含了一个 Button,这段代码你可以直接写到你的代码中灵活复用,就像这样: ?

88350

Android开发必备知识:为什么说Kotlin值得一试

因为这段代码是 inline 的,最终编译时是要编译到调用它的代码块中,这时候T的类型实际上是确定的,因而 Kotlin 通过 reified 这个关键字告诉编译器,T 这个参数可不只是个摆设,我要把它当实际类型来用呢...通常我们需要执行一段异步的代码,我们会构造一个 Runnable 对象,然后交给 executor,比如这段 java 代码: ? 用 Kotlin 怎么写呢?...,Scala 的模式匹配才真正犀利——Kotlin 当中也有这样的特性,我们下面就来看个例子: ?...当然有人会说我们应当 proguard 做混淆,我想说的是,proguard 自然是要用到的,不过那是 SDK 这个产品加工的下一个环节了,我们为什么不能在代码级别把这个事情做好呢?...一个 LinearLayou t包含了一个 Button,这段代码你可以直接写到你的代码中灵活复用,就像这样: ?

1.1K90

Scalaz(27)- Inference & Unapply :类型的推导和匹配

经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了。...本来不想花什么功夫在scala类型系统上,但在阅读scalaz源代码时往往遇到类型层面的编程(type level programming),常常扰乱了理解scalaz代码思路,所以还是要简单的介绍一下...scala类型系统的主要功能就是在程序运行之前,在编译时(compile time)尽量捕捉代码中可能出现的错误,也就是类型匹配错误。...scala类型系统是通过找寻隐式转换类型证例(implicit type evidence)来判断代码中当前类型是否期待的类型从而确定是否发生类型错误(type error)。...A]] 过不了编译。看这个错误提示[?G[?A]],实际上编译器期待的是个F[G[A]]款式的输入参数但我们提供的是个F[G[A,B]]这么个款式,把编译器搞糊涂了。

1.1K80

如何使用IDEA加载已有Spark项目

背景是这样的:手上有一个学长之前实现的Spark项目,使用到了GraphX,并且用的Scala编写,现在需要再次运行这个项目,但如果直接在IDEA中打开项目,则由于各种错误会导致运行失败,这里就记录一下该如何使用...确定项目的版本环境 这一步是非常重要的,很多情况下就是由于版本的匹配导致代码解析出现错误,主要的环境版本包括: Java Version 1.8 必须 scala-sdk-x.xx.x spark-assembly-x.x.x-hadoop.x.x.jar...Java的版本 这里由于要是用Scala所以必须使用 Version 1.8+,关于如何修改版本这里赘述。...这部分的修改要具体情况具体分析,但大致都有以下几步: 查看Main函数的传入参数,如果带参数的,要明确参数的具体意义,一个是参数类型一个是参数意义。比如迭代次数,或是文件路径。...上述几步修改完成后,原先的代码基本就可以跑起来了,再次强调这里使用了NoSBT的模式,手动添加了一个assembly包,再就是对应Scala-SDK的版本,最后对代码内容上进行部分改动,使其可以在本地单机进行调试运行

1.9K20

Scala兴衰史:暂时的没落或许是一个新的开始

· 清晰:没有副作用的编程能创建出更容易规律可循的代码 - 一个函数通过输入和输出完全被描述出来。一个函数今天可以生成正确答案,明天也会生成正确答案。这样创建的代码更容易调试,测试和重用。...还意味着,Scala 代码在理论上可以与 Java 代码相互操作,为 Java 开发团队提供了一个桥梁,以轻松进入 Scala。...· Scala 在语法上和 Java 相似,并且像 Java 一样,在编译时执行类型检查而不是在运行时,从而消除了由类型兼容而导致运行错误的可能性。...· Scala 内置对模式匹配的支持,可以基于值模式来匹配任意数据类型,以便于对每个匹配模式执行不同的操作。 · Scala 将 Akka 作为一个标准库,支持丰富的并发模型。...这不仅仅是由于学**曲线的短期下降 — 这是一些开发团队使用 Scala 一整年后的观察结果。 · 不像 Java,Scala一个灵活的语法,通常会提供很多方法来达到相同的结果。

2K40
领券