浏览 2388 次
锁定老帖子 主题:scala的优雅--自定义控制结构
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-02
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能力,值得期待 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-03
全是代码,给个解释行不?
另外,其实groovy也能自定义结构,不过好像groovy并没有着重提这一点,是没有意识到还是别的什么原因。 |
|
返回顶楼 | |
发表时间:2009-09-03
scala是下下下一代java,groovy是下一代java,差辈呢
看看大意就行了,要解释就要从头开始讲了 |
|
返回顶楼 | |
发表时间: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 } 把“实现控制结构”单独提出来应该是几十年前的事情了 …… |
|
返回顶楼 | |
发表时间:2009-09-03
night_stalker 写道 类似于 ruby 的 block,也不算什么开天辟地的发明创造。
这个功能应该所有的新语言都能实现,不过它的意义很大,所以scala要特别提出。从这点看scala的眼界是独到的。 ruby没仔细看过,不清楚。 regale 写道 scala是下下下一代java,groovy是下一代java,差辈呢
看看大意就行了,要解释就要从头开始讲了 没有必要这样说,groovy也有他独到的地方。 |
|
返回顶楼 | |