Scala
开山鼻祖 Martin Odersky
语言特性
case class: 无需用 new 实例化, 默认带有 getter 等定义,最为主要的:其实例可以用模式匹配
Traits
设计模式之 scala 版本
Scala VS. Java
参考
Hello World in Java:
public class HelloJava {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Hello World in Scala:
object HelloScala {
def main(args: Array[String]): Unit = {
println("Hello World!")
}
}
创建一个字符串列表
Java:
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
Scala:
val list = List("1", "2", "3")
将字符串列表转化为整型列表 Java:
List<Integer> ints = new ArrayList<Integer>();
for (String s : list) {
ints.add(Integer.parseInt(s));
}
Scala:
val ints = list.map(s => s.toInt)
创建传统的 java 对象 First, the Java version:
public class User {
private String name;
private List<Order> orders;
public User() {
orders = new ArrayList<Order>();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Order> getOrders() {
return orders;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
}
public class Order {
private int id;
private List<Product> products;
public Order() {
products = new ArrayList<Product>();
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
}
public class Product {
private int id;
private String category;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
}
scala 版本
class User {
var name: String = _
var orders: List[Order] = Nil
}
class Order {
var id: Int = _
var products: List[Product] = Nil
}
class Product {
var id: Int = _
var category: String = _
}
总结一下,首先从形式上,scala 去除了语句结尾繁琐的分号,语法上更为灵活,例如函数名可以是任意符号(例如 +++
)。
scala 中的类可以有参数,而 java 中的不行。
scala 没有 static, 而是将一切 static 都用单例对象取而代之 Java 中不支持运算符重载,而 scala 中可以。
scala 中,一切皆对象,包括数字、函数等都是对象,而 java 区分原型(如 int)和引用类型。
scala 中的无参方法和零参方法:前者无论定义还是调用,都没有括号,就好像字段一样
scala 宏
宏在代码生成等方面是很有用的
在2.10和2.11中都是实验性质,且只有 def 宏,后续会加入 Type Macros 等。
Macros are functions that are called by the compiler during compilation
def m(x: T): R = macro implRef
scala 周边
Spark 大数据利器
Play 大名鼎鼎的框架
-
另一款框架。A suite of scala libraries for building and consuming RESTful web services on top of Akka: lightweight, asynchronous, non-blocking, actor-based, testable
logback 日志系统
更多参见 Awesome scala