多范式的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性
就这一行。构造、字段、equals、hashCode、toString——全部自动生成,而且还不止这些。
实例成员属于对象,静态成员属于类——它们写在同一个类里,但本质上是两个世界的东西。
Java做不到。Java的方法调用必须把所有参数一次传完——你不能"先传一部分,剩下的以后再说"。
一个类,两个private辅助方法。看起来挺正常——但你有没有想过:这两个辅助方法,只有normalize这一个地方用到。它们是类级别的方法,但其实它们应该是n...
Scala呢?Scala从第一天就有匿名函数——而且它的匿名函数比Java的Lambda更彻底、更灵活。
Java程序员写过public static void main(String... args)吧?这个String...就是Java的可变参数。
Java程序员写方法重载的时候,一定有过这种痛苦:一个方法有三个参数,你想让调用方在某些情况下可以不传那几个参数。怎么办?写三个重载方法。
Java程序员对递归的印象,大概停留在"写个阶乘"、"写个斐波那契"这种教科书示例里。实际项目里很少用——因为递归太容易栈溢出了。
Java程序员第一次写Scala函数的时候,一定会困惑一件事:为什么Scala的函数写起来这么奇怪?
你有没有遇到过这种情况:一个函数明明需要返回两个值——比如查询数据库,既要返回数据,又要返回总行数;既要返回成功结果,又要返回错误信息。Java里你怎么处理?要...
上一篇我们聊了不可变Map——它O(1)的查找、它的函数式操作,在大数据开发里无处不在。但有个问题:如果你要在一个循环里不断往Map里加key-value对,用...
在Spark里做用户去重,你会用什么?在Flink里做实时UV统计,你会用什么?在ETL里做维度关联,你会用什么?答案都是Set。但很多人用了几年Set,对它的...
很多人用了几年Scala,对ListBuffer的认知还停留在"可变版List"。但如果你真的读过它的源码,会发现这是一个设计极其精妙的类——它不是简单的"可变...
Scala的List不是Java的List——它是不可变的链表,是函数式编程的核心数据结构。head/tail递归、模式匹配、::构造,让列表处理从Java的f...
Array是定长的,ArrayBuffer是动态的。当你需要边遍历边添加、边过滤边收集时,ArrayBuffer就是你的首选。它不是ArrayList的翻版,而...
Scala的Array就是Java数组的封装,但Scala给它装上了集合操作的"超能力"。索引访问、map/filter、与List互转——让数组处理从Java...
Scala的String就是java.lang.String,但Scala给它装上了强大的"扩展方法"。插值器、多行字符串、集合操作化——让字符串处理从Java...
Java的if是语句,Scala的if是表达式;Java的for是循环,Scala的for是推导式。理解Scala控制流的"表达式思维",是写出地道Scala代...
Scala的类和对象系统比Java更简洁、更强大。主构造器、伴生对象、case class、继承与多态——理解这些核心概念,是掌握Scala面向对象编程的关键。