Scala第三章学习笔记

换行后的左大括号造成的问题:

class FooHolder
{
    def foo()
    {
        println("foo was called")
    }
}

Scala认为def foo()这行代码定义了一个抽象方法。这是因为它没有捕捉到后面的大括号,认定def foo()是完整的一行语句。当编译时,它认为这是一个洗呢匿名代码块,应该在类构建过程中执行。

解决办法:加一条新的编码规定,要求所有的方法定义使用"="语法。

trait FooHolder2{
    def foo() : Unit = 
    {
        println("foo2 was called")
    }
}

 空悬的操作符和括号表达式

"大字符串聚合"是空悬操作符能够帮到编译器的例子,指你试图创建一个很大的、无法在一行里完整定义的字符串。

java例子:

class test{
    private int x = 5;
    private String foo() {
        return "HAI"
            + x
            + "ZOMG"
            + "\n";
        }
}

在Scala下就会编译失败,可以把操作符放到行末,从而知道后面还有更多内容

class test{
    private int x = 5;
    private String foo() {
        return "HAI" +
             x +
           "ZOMG" +
           "\n";
        }
}

也可以增加括号

class test{
    private int x = 5;
    private String foo() {
        return ("HAI"
            + x
            + "ZOMG"
            + "\n";)
        }

 Scala的特质是线性化的,所以如果想要使用覆盖的方法,可以在实例化对象的时候混入父类,而不需要定义新的类。

trait Animal {def talk : String}
trait Mammal extends Animal
trait Cat {def talk = "Meow"}

val x = new Mammal with Cat 

x.talk

执行结果如下:

注解优化 @tailrec @switch注解

使用@switch注解

编译器给出了警告语句。因为模式匹配无法优化,编译不过。

@tailre 注解用于确保可以对方法执行尾递归优化,是把最后一句语句调用自身的函数转换为不占用栈控件,而是类似传统的while或for循环那样执行。JVM本身不支持,所以依赖于Scala编译器来执行优化。

要优化尾递归调用,Scala编译器需要以下条件。

(1)方法必须是final或私有。方法不能多态。

(2)方法必须注明返回类型。

(3)方法必须在其某个分支的最后一句调用自身。

广度优先搜索算法是搜索图或树的一种算法:先检查顶层元素,然后是这些元素的最近邻居,然后是最近邻居的最近邻居,据此类推,直到找到你想要的元素。

def search(start : Node, p : Node => Boolean) = {
    @tailrec
    def loop(nodeQueue : List[Node],visited : Set[Node]) : Option[Node] =
    nodeQueue match{
        case head :: tail if p(head) =>
        some(head)
        case head :: tail if !visited.contains(head) =>
            loop(tail ++ head.edges, visited + head)
        case head :: tail ==> 
        loop(tail,visited)
        case head Nil => 
        None
     }
   loop(List(start),Set())
}

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闪电gogogo的专栏

Python——正则表达式

此篇文章结合小甲鱼的笔记和视频整理。 1 编译 Python 通过 re 模块为正则表达式引擎提供一个接口,同时允许你将正则表达式编译成模式对象,并用它们来进行...

295100
来自专栏智能算法

极简Python入门

本文旨在帮助从总体上帮助了解Python的一些基本属性,具体的使用技巧需要通过不断实践积累 一、Python的基本特性 ? ? ? 二、Python的类 ...

31760
来自专栏Hongten

J2SE 接口 [interface]

/**  * 接口  *  接口 [interface]是抽象方法和常量值的定义的集合  *    *  从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含...

9020
来自专栏Java Web

Java学习笔记(3)—— String类详解

前言 因为没有成功地为IDEA配上反编译工具,所以自己下载了一个XJad工具,背景是白色的,所以忍着强迫症硬是把IDEA的主体也给换成白色了,感觉为了这篇文章...

28450
来自专栏java一日一条

Java中关于String类型的10个问题

简单来说,“==”是用来检测俩引用是不是指向内存中的同一个对象,而equals()方法则检测的是两个对象的值是否相等。只要你想检测俩字符串是不是相等的,你就必须...

7910
来自专栏Zephery

2017-03-03学习笔记

一、String StringBuffer.toString()源码: @Override public synchronized String toStrin...

363110
来自专栏架构之路

JAVA基础知识点:内存、比较和Final

1.java是如何管理内存的 java的内存管理就是对象的分配和释放问题。(其中包括两部分) 分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对...

48040
来自专栏星汉技术

Java API:Object class

16570
来自专栏進无尽的文章

基础篇-ObjectC继承、类别、属性

    在实际的开发过程中,继承和类别都会得到很多用处。对于界面相似度很高的情况下,使用继承可以节省很多代码和设置,只需要在子类中重写父类中的方法,或者增加新的...

8610
来自专栏Java架构师历程

精选30道Java笔试题解答

都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底,老手们就不用进来...

35840

扫码关注云+社区

领取腾讯云代金券