`
regale
  • 浏览: 10510 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

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

阅读更多
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能力,值得期待
分享到:
评论
4 楼 徐风子 2009-09-03  
night_stalker 写道
类似于 ruby 的 block,也不算什么开天辟地的发明创造。

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

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

没有必要这样说,groovy也有他独到的地方。
3 楼 night_stalker 2009-09-03  
实质就是在末尾传递了一个 block 。 // 开始看错鸟 ..

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

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


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


把“实现控制结构”单独提出来应该是几十年前的事情了 ……
2 楼 regale 2009-09-03  
scala是下下下一代java,groovy是下一代java,差辈呢
看看大意就行了,要解释就要从头开始讲了
1 楼 徐风子 2009-09-03  
全是代码,给个解释行不?
另外,其实groovy也能自定义结构,不过好像groovy并没有着重提这一点,是没有意识到还是别的什么原因。

相关推荐

    scala-json-collection_2.9.1-1.1.1.zip

    1. JSON解析器:用于将JSON字符串解析成Scala数据结构。 2. JSON生成器:将Scala对象转换成JSON格式的字符串。 3. 类型映射:自动将JSON数据映射到Scala类实例,反之亦然。 4. 错误处理:提供优雅的错误处理机制,如...

    impress-js-scala-presentaion-sample:包含使用 impress-js 的 Scala 演示

    3. `js` 目录 - 可能包含自定义的JavaScript代码,例如用Scala生成的数据或逻辑,这些代码可能与impress.js库一起工作,以实现特定的交互效果。 4. `images` 或 `media` 目录 - 用于存储演示文稿中使用的图片、图标...

    scala-samples:Scala 示例代码

    Scala还引入了模式匹配,这是一种强大的控制流构造,能够处理复杂的数据结构。模式匹配可以用于解构数据,例如在处理列表、元组或者自定义案例类时。在样本代码中,我们可以期待看到如何使用模式匹配进行条件判断和...

    Programming in Scala

    - 如何使用Scala的高阶函数来创建自定义的控制结构。 - 实践案例分析。 10. **Composition and Inheritance(组合与继承)**: - 组合(composition)和继承(inheritance)之间的权衡。 - Scala中如何更好地利用...

    Scala语言规范.zip

    7. **模式匹配**:Scala的模式匹配功能强大,可以用于解构复杂数据结构,如列表、元组或自定义类。它也常用于case类和case对象的匹配。 8. **类型类**:Scala中的类型类是一种设计模式,允许在运行时添加新行为到已...

    Scala 高级编程及实例

    - **命令式控制结构**:介绍了Scala中的命令式编程元素。 - **示例:离散事件模拟**:通过一个具体的例子来展示如何在Scala中实现离散事件模拟。 - **总结**:对本章内容进行了总结。 #### 十二、使用流进行计算 这...

    Scala-Backend

    本课程围绕 Scala 后端展开,重点介绍了变量、控制结构、LeetCode 问题解决以及简单的单行计算器的实现。 首先,我们来详细讨论 Scala 中的变量。在 Scala 中,变量分为两种类型:val(不可变变量)和 var(可变...

    Scala Cookbook

    异常处理(exception handling),Scala的异常处理机制与Java类似,但提供了更高级的控制和自定义异常处理的能力;文件和网络操作(file and network operations),Scala可以简洁地处理文件的读写以及网络编程任务...

    Android-Monad,像scala那样的android上的monad.zip

    通过Monad,开发者可以更好地控制这些流程,避免回调地狱,并实现更清晰的代码结构。 该项目的"Android-Monad-master"文件夹可能包含以下内容: 1. **源码**:项目的Java或Kotlin源代码,展示了如何在Android环境...

    cron4s:Scala的跨平台CRON表达式解析

    cron4s为Scala开发者提供了一种优雅的方式来处理CRON表达式,无论是在服务器端的JVM环境中,还是在客户端的JavaScript环境中。它的跨平台性、类型安全性和函数式接口,使得定时任务的管理变得简单而高效。通过理解和...

    Scala with Cats

    《Scala with Cats》这本书主要探讨了Scala编程语言中与函数式编程相关的概念,特别是Cats库的使用。书中特别强调了Monads这一重要的抽象概念,它们在Scala中扮演着核心角色,很多程序员即使不知道其名称,也会在...

    scala with cats

    《Scala with Cats》是关于Scala函数式编程的深入探讨,它由Noel Welsh和Dave Gurnell编著,...这本书为有Scala基础的程序员提供了一个高级话题的引入,帮助他们理解和使用函数式编程概念来编写更加优雅、简洁的代码。

    func-programming-scala:Scala Coursera课程分配解决方案中的函数式编程原理

    模式匹配是Scala中的另一个强大工具,它可以用于解构复杂数据结构,如元组、列表和自定义案例类。通过模式匹配,我们可以优雅地处理多种情况,而无需冗长的if-else语句。 **函数式数据结构** Scala提供了许多函数...

    基础算法之数据结构.docx

    8. **控制结构**:Scala不提供`break`和`continue`,但通过`breakable`块可以模拟类似功能。 9. **函数和方法**:函数是独立的代码单元,方法是类的一部分。Scala中的函数可以嵌套定义,没有重载和重写,但方法可以...

    Kotlin文档

    - **控制流结构**:Kotlin提供了多种控制流结构,如`if`、`when`、`for`和`while`循环。 #### 类和对象 - **类定义**:Kotlin中的类定义简单直观,支持继承和接口实现。 - **构造函数**:Kotlin支持主构造函数和次...

    kotlin for java or android 中文开发文档

    - **习惯用法**:Kotlin 引入了一些新的习惯用法,如惰性初始化、范围表达式等,这些特性可以帮助开发者写出更加优雅的代码。 - **编码规范**:为了保持代码的一致性和可维护性,Kotlin 提供了一套编码规范指南。 - ...

    Kotlin学习文档

    - **控制流**:Kotlin支持常见的控制结构,如`if`、`when`、`for`、`while`等,并且引入了一些改进,如将`when`表达式作为条件判断和多分支选择的组合使用。 - **返回和跳转**:Kotlin提供了多种方式来控制流程的...

    Kotlin中文文档

    - **属性和字段**:属性在 Kotlin 中非常重要,支持读写分离,并可以通过 getter 和 setter 方法自定义访问逻辑。 - **接口**:Kotlin 的接口可以定义方法和属性,类似于 Java 8 的接口特性。 - **可见性修饰符**:...

    akkaflow-源码.rar

    《Akka流:深入解析源码》 ...通过深入理解和分析"akkaflow-源码.zip",不仅可以掌握Akka流的基本工作原理,还可以学习到高级的并发控制和数据处理技巧,这对于提升你的Scala和分布式系统开发能力具有极大帮助。

    jsondsl:JSON DSL的无标签最终样式

    JSON DSL(领域特定语言)是一...通过选择不同的解释器,开发者可以灵活地控制JSON的处理方式,如生成字符串、写入文件或其他自定义行为。无标签最终样式不仅提高了代码的可读性和可维护性,还降低了DSL实现的复杂度。

Global site tag (gtag.js) - Google Analytics