Scala第一章学习笔记

  面向对象编程是一种自顶向下的程序设计方法。用面向对象方法构造软件时,我们将代码以名词(对象)做切割,每个对象有某种形式的表示服(self/this)、行为(方法)、和状态(成员变量)。识别出名词并且定义出他们的行为之后,再定义出名词之间的交互。

  函数式编程方法通过组合和应用函数来构造软件。纯粹是对输入进行操作,产生结果。所有变量都被认为是不可变的。

  Spring的JDBCTemplate类上的查询方法

public interface JdbcTemplate{
    List query(PreparedStatementCreator psc,RowMapper rowMapper)
    .......
}

  用Scala直译

trait JdbcTemplate{
    def query(psc : PreparedStatementCreator,rowMapper : RowMapper) : List[_]
}

看一下PreparedStatementCreator接口和RowMapper接口

public interface PreparedStatementCreator {
    PreparedStatement createPreparedStatement(Connection con) throws SQLException;
}


public interface RowMapper{
    Object mapRow(ResultSet rs, int rowNum) 
throws SQLException;
}

Scala提供了一等函数,把JdbcTemplate查询方法改成接受函数而不是接口作为参数。这样query方法就编程函数式了,返回值为ResultItem,这就是传说中的租借模式了。这样就创建了一个直接使用函数参数的接口了。

trait JdbcTemplate{
    def query[ResultItem](psc:Connection => PreparedStatement; rowMapper : (ResultSet,Int) => ResultItem) : List[ResultItem]
}

Scala组合断言, or 方法接受两个断言,f1,f2,产生一个匿名函数。这个函数接受函数t,然后把f1(t)和f2(t)的结果 or 一下。

object Predicates{
    def or[T](f1 : T => Boolean, f2 : T =>Boolean) = (t : T) => f1(t) || f2(t)

    def and[T](f1 : T =>Boolean,f2 : T=> Boolean) = (t : T)=> f1(t) && f2(t)

    val notNull[T] : T => Boolean = _ != null

                                   (_为语法占位符)

Scala把变量类型等基本操作

//可变整型变量
var x : Int

//不可变整型变量
val x : Int

//延迟执行的不可变整形变量
lazy val x : Int

//用户指定类型
val x : Int = 5

//编译器推断类型
val y = 5


def myMethod(functionLiteral : A => B) : Unit
//显示的类型声明
myMethod({ arg : A : => new B})
//类型推断
myMethod({ arg => new B})

较简洁版的Scala快速排序

def qsort[T <% Ordered[T]](list:List[T]):List[T] = list match{
    case Nil => Nil
    case x :: xs =>
        val (before,after) = xs partition ( _ < x)
        qsort(before) ++ (x :: qsort(after));
)

Scala调用Java 使Java类库成为用Scala做开发时很自然的事

//Java对象
class SimpleJavaClass {
    private String name;
    public SimpleJavaClass(String name){
    this.name = name;
    }
    
    public String getName(){
     return name;
    }
    
    public static SimpleJavaClass create(String name){
        return new SimpleJavaClass(name);
    }
}

//Scala里使用简单java对象

    val x = SimpleJavaClass.create("Test")
    x.getName()
    val y = new SimpleJavaClass("Test")

Scala对象映射到java Scala对象实际上是一个单例类,在编译时此单例类命名为对象名后价格$符号。这个单例类里有个Module$静态成员,指向其唯一实例。

//Scala 对象
object ScalaUtils{
    def log(msg : String) : Unit = Console.println(msg)
    
    val MAX_LOG+SIZE = 1056
}


//在Java里使用Scala对象
ScalaUtils.log("Hello!");
ScalaUtils$.MODULE$.log("Hello");
System.out.println(ScalaUtils$.MODULE$.MAX_LOG_SIZE());
System.out.println(ScalaUtils.MAX_LOG_SIZE());

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静晴轩

类数组借用数组方法

于JavaScript如何将对象转化为数组对象,其用法写法已经很常见且完善,比如JQuery中的makeArray函数对此的实现,也是跟大家想的差不多,只是考虑...

3609
来自专栏androidBlog

笔试题—字符串常见的算法题集锦

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

1631
来自专栏Java开发者杂谈

JDK1.7新特性(2):异常和可变长参数处理

异常 jdk1.7对try--catch--finally的异常处理模式进行了增强,下面我们依次来看增强的方面。   1. 为了防止异常覆盖,给Throwab...

2614
来自专栏程序员宝库

如何用JavaScript手动实现一个栈

在生活中也能发现很多栈的例子。例如,厨房里堆放的盘子,总是叠在上方的先被使用;输入框内容进行删除时,总是最后输入的先删除;弹夹中的子弹,越后装入的,越先发射.....

1224
来自专栏智能算法

程序员必须了解的数据结构:Array、HashMap 与 List

当开发程序时,我们(通常)需要在内存中存储数据。根据操作数据方式的不同,可能会选择不同的数据结构。有很多常用的数据结构,如:Array、Map、Set、List...

1380
来自专栏个人随笔

Java 关于集合框架那点事儿

 1.引入集合框架   采用数组存在的一些缺陷:    1.数组长度固定不变,不能很好地适应元素数量动态变化的情况。    2.可通过数组名.length获取数...

29610
来自专栏小工匠技术圈

【小工匠聊密码学】-- Base64算法

1453
来自专栏Golang语言社区

【Go 语言社区】POJ 1047 Round and Round We Go 循环数新解

题目描述: 给定一字符串表示的高精度数,判断它是否是可循环的。如果假设字符串num的长为n,则将num从1开始乘到n,如果每次得到的结果包含的字符元素都和a是相...

35811
来自专栏软件开发

JavaSE学习总结(八)—— 异常处理(Exception)

一、理解异常及异常处理的概念 异常就是在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序。 异常不是错误 程序中关键的位置有异常处理,提高程序的稳定...

2339
来自专栏java学习

重要通知!小编出新的Java练习题咯!!

正确答案 3月5号公布 一、选择题和问答题 1、在一个java原文件中,import, class, package语句的顺序是( )。 A. import ...

4665

扫码关注云+社区

领取腾讯云代金券