论坛首页 Java企业应用论坛

scala的优雅--自定义控制结构

浏览 2388 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-02  
C#有using 控制结构 如下:
using (TextReader textReader = new StreamReader(filename))
{
return textReader.ReadLine();
}

用scala实现如下
object Control {
def using[A <: {def close(): Unit}, B](param: A)(f: A => B): B =
try {
f(param)
} finally {
param.close()
}
import scala.collection.mutable.ListBuffer
def bmap[T](test: => Boolean)(block: => T): List[T] = {
val ret = new ListBuffer[T]
while(test) ret += block
ret.toList
}
}

用java实现找所有Person 的功能
import java.sql.*;
import java.util.ArrayList;
public class Person {
private String name;
private int age;
private boolean valid;
public Person(String n, int a, boolean v) {
name = n;
age = a;
valid = v;
}
public static ArrayList<Person> findPeople(Connection conn)
throws SQLException {
Statement st = conn.createStatement();
try {
ResultSet rs = st.executeQuery("SELECT * FROM person");
try {
ArrayList<Person> ret = new ArrayList<Person>();
while (rs.next()) {
ret.add(new Person(rs.getString("name"),
rs.getInt("age"),
rs.getBoolean("valid")));
}
return ret;
} finally {
rs.close();
}
} finally {
st.close();
}
}
}

同样的功能用刚才定义的自定义控制结构实现
case class Person(name: String, age: Int, valid: Boolean)
object Person {
import Control._
import java.sql._
def findPeople(conn: Connection): List[Person] =
using(conn.createStatement){st =>
using (st.executeQuery("SELECT * FROM person")){rs =>
bmap(rs.next){
new Person(rs.getString("name"), rs.getInt("age"), rs.getBoolean("valid"))
}
}
}
}
scala有强大的dsl能力,值得期待
   发表时间:2009-09-03  
全是代码,给个解释行不?
另外,其实groovy也能自定义结构,不过好像groovy并没有着重提这一点,是没有意识到还是别的什么原因。
0 请登录后投票
   发表时间:2009-09-03  
scala是下下下一代java,groovy是下一代java,差辈呢
看看大意就行了,要解释就要从头开始讲了
0 请登录后投票
   发表时间:2009-09-03   最后修改:2009-09-03
实质就是在末尾传递了一个 block 。 // 开始看错鸟 ..

类似于 ruby 的 block,也不算什么开天辟地的发明创造。

举个 ruby 的例子:(这里模仿一下 using,当然有更简单的方法做同样的事情)
def using x
  yield x
ensure
  x.close
end


using(File.open filename) {|f|
  f.readlines
}


把“实现控制结构”单独提出来应该是几十年前的事情了 ……
0 请登录后投票
   发表时间:2009-09-03  
night_stalker 写道
类似于 ruby 的 block,也不算什么开天辟地的发明创造。

这个功能应该所有的新语言都能实现,不过它的意义很大,所以scala要特别提出。从这点看scala的眼界是独到的。
ruby没仔细看过,不清楚。

regale 写道
scala是下下下一代java,groovy是下一代java,差辈呢
看看大意就行了,要解释就要从头开始讲了

没有必要这样说,groovy也有他独到的地方。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics