返回信息流scala是个什么鬼嘛,打算入门一下,看了下快学scala,我的天,是要颠覆我对程序的人是吗,怎么这么奇怪这么别扭,看的我不要不要的啊,受不了啊,要死了啊,书里面说的还不清不楚的,有没有什么书讲的比较清楚透彻一点的啊,求推荐啊,哎,我再去看一章睡了。。。。
这是一条镜像帖。来源:北邮人论坛 / java / #53362同步于 2016/9/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
scala是个什么鬼啊
cc19931002
2016/9/30镜像同步11 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
【 在 cc19931002 的大作中提到: 】
: scala是个什么鬼嘛,
EPFL的Martin Odersky发明的编程语言。名称来自“SCAlable LAnguage”,简称“Scala”。最大的特色就是大量的语法糖。不管程序规模多大,语法上看起来都像小程序一样漂亮。
: 打算入门一下,看了下快学scala,我的天,是要颠覆我对程序的人是吗,怎么这么奇怪这么别扭,看的我不要不要的啊,受不了啊,要死了啊,书里面说的还不清不楚的,有没有什么书讲的比较清楚透彻一点的啊,求推荐啊,哎,我再去看一章睡了。。。。
看看Programming Scala。或许不是最新版的,但是有免费版。如果找不到的话,可以找《programming in scala》,这本是Martin本人写的,甚至会涉及Scala 2.12的新特性,值得一看。
【 在 cc19931002 的大作中提到: 】
: scala是个什么鬼嘛,打算入门一下,看了下快学scala,我的天,是要颠覆我对程序的人是吗,怎么这么奇怪这么别扭,看的我不要不要的啊,受不了啊,要死了啊,书里面说的还不清不楚的,有没有什么书讲的比较清楚透彻一点的啊,求推荐啊,哎,我再去看一章睡了。。。。
顺便来炫耀一下Scala。这么好的语言。。。。
Scala比Java好的地方,就是,当程序规模变大了以后,Java会退化成汇编语言,但Scala仍然是高级语言。
```java
// Java
int a = 1, b = 2, c = 3;
int d = a * b + c;
```
```scala
// Scala
val a: Int = 1 // “:Int”可以省略
val b = 2
val c = 3
val d = a * b + c
```
但是一旦数字变大,int甚至long都不能储存了。Java用BigInteger,Scala用BigInt(封装的BigInteger),但看看代码:
```java
// Java
BigInteger a = BigInteger.valueOf(1L);
BigInteger b = BigInteger.valueOf(2L);
BigInteger c = BigInteger.valueOf(3L);
BigInteger d = a.multiply(b).add(c);
```
```scala
// Scala
val a = BigInt(1)
val b = BigInt(2)
val c = BigInt(3)
val d = a * b + c
```
Java里,可以用`synchronized`语句来获取对象的锁,用try-with-resource语句自动关闭文件
```java
Object o = ...;
synchronized(o) {
doSomething(o);
} // 自动解锁
try(FileInputStream fis = new FileInputStream(...)) {
fis.read(...);
} // 自动关闭
```
但是Java的方便语法仅仅限于语言里规定的几个特例。一旦超出了这个范围,Java就没办法提供抽象了。
比如想要建立sql数据库连接,然后对每一行做一些事情,手动的方法这样做:
```java
with (Connection conn = dataSource.getConnection()) {
with (Statement stmt = conn.createStatement()) {
with (ResultSet rs = stmt.executeQuery("SELECT name, age FROM students;")) {
while (rs.next()) {
String name = rs.getString(1);
int age = rs.getInt(2);
// do something with them
}
}
}
}
```
但是如果我说:我真正关心的是(1)那个SQL语句,以及(2)在while循环里对ResultSet做什么。如果我想把这两部分抽象出来,Java非常麻烦:
```java
public interface ResultSetHandler {
void handle(ResultSet rs);
}
public class DataAccessObject {
private DataSource dataSource;
// getters and setters here
public void queryAndHandleResults(String sql, ResultSetHandler handler) {
with (Connection conn = dataSource.getConnection()) {
with (Statement stmt = conn.createStatement()) {
with (ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
handler.handle(rs)
}
}
}
}
}
}
public class Main {
public static void main(String[] args) {
DataAccessObject dao = ...;
dao.queryAndHandleResults("SELECT a FROM table1;", new ResultSetHandler {
@Override public void handle(ResultSet rs) {
int a = rs.getInt(1);
System.out.println(a);
}
}
}
}
```
Java没有特殊的语法来处理这些情形。但Scala很容易用灵活的语法糖来创造新的结构。
```scala
class DataAccessObject(dataSource: DataSource) {
// handler可以是函数类型,不需要是接口。
def queryAndHandleResults(sql: String)(handler: ResultSet => ()): Unit = {
for {
conn <- managed(dataSource.getConnection)
stmt <- managed(conn.createStatement)
rs <- managed(stmt.executeQuery(sql))
} {
while(rs.next()) {
handler(rs)
}
}
}
}
class Main extends App {
val dao = new DataAccessObject(...)
// 不用实现内部类,可以直接用lambda函数表示。
dao.queryAndHandleResults("SELECT a FROM table1;") { rs =>
val a = rs.getInt(1)
println(a)
}
}
```
看Scala可以让我少写多少代码。现在,Java1.8把Scala的lambda也学走了,那个`ResultSet => ()`类型在Java1.8里可以用`java.util.function.Consume<ResultSet>`来表示了。进步很大,但比起Scala的scalability来说还是太啰嗦了。
不说spark就是用scala写的吗,不了解下scala真的能上手spark吗
【 在 cocoyimasa 的大作中提到: 】
: 。。。还好吧。不过Scala这种大杂烩,特性就是多一点。如果纯粹为了spark之类的,为什么不用Java?
thank you
【 在 nuanyangyang 的大作中提到: 】
:
: EPFL的Martin Odersky发明的编程语言。名称来自“SCAlable LAnguage”,简称“Scala”。最大的特色就是大量的语法糖。不管程序规模多大,语法上看起来都像小程序一样漂亮。
:
: ...................
这个得等我再多看几章才能看明白,现在还有点蒙
【 在 nuanyangyang 的大作中提到: 】
: [md]
: 顺便来炫耀一下Scala。这么好的语言。。。。
: Scala比Java好的地方,就是,当程序规模变大了以后,Java会退化成汇编语言,但Scala仍然是高级语言。
: ...................
Spark 有 Java 的接口,所以是可以上手的。
但是到后面还是得用 Scala,一方面 Scala 写代码比 Java 快且漂亮,另一方面是你得看 Spark 源码。
【 在 cc19931002 的大作中提到: 】
: 不说spark就是用scala写的吗,不了解下scala真的能上手spark吗