首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Scala如何改变了我的编程风格:从命令到函数

尽管C++里面这种编程风格是有可能的,但在我使用C++的日子里,我却没有考虑用这种方式进行多重继承,而我C++设计中也不怎么使用抽象基。...Scala能让我写出几乎跟Ruby和Python 一样简洁的代码。 Scala 我可以跟在 Java 里面一样方便地调用 Java 库,包括我已有的 Java 库。...但 Scala 还让我以简洁和类型安全的方式获得某些通常是动态语言的好处,例如在已有上增加新方法的能力,或者将类型传递给没有共同继承关系的方法。 Scala 是怎样改变了我对编程的看法的呢?...甚至于尽管本例中并无类型标注, Scala类型推断机制也会给 nameHasUpperCase 赋予 Boolean 类型。...另外需要注意的一点不同是命令例子中潜在的偏移错误,因为你必须地指出迭代的上标。函数化的版本里这种错误不会产生,在这种方式下,函数化版本相对而言不易出错。

1.1K30

13.10 Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition13.10 Scala中使用JSON.t

项目和系统的开发中,为了提高方法的灵活度和可复用性,我们经常要传递不确定数量的参数到方法中,Java 5之前常用的设计技巧就是把形参定义成Collection类型或其子类类型,或者是数组类型,这种方法的缺点就是需要对空参数进行判断和筛选...而 Java 5引入变长参数(varags)就是为了更好地提高方法的复用性,让方法的调用者可以“随心所欲”地传递实参数量,当然变长参数也是要遵循一定规则的, 比如变长参数必须是方法中的最后一个参数;一个方法不能定义多个变长参数等...现在的问题是编译器为什么会首先根据2个int类型的实参而不是1个int类型、1个int数组类型的实参来查找方法呢?...Scala编译器的处理方式就比较“”了,直接抛出“ambiguous reference to overloaded definition” ERROR。...解决方案: scala代码中调用:toJSONString(Object object, SerializerFeature... features) 。 另外,不推荐带有变长参数的方法重载。

81930
您找到你想要的搜索结果了吗?
是的
没有找到

Scala中使用JSON.toJSONString报错:ambiguous reference to overloaded definition问题描述:原因分析:解决方案:

项目和系统的开发中,为了提高方法的灵活度和可复用性,我们经常要传递不确定数量的参数到方法中,Java 5之前常用的设计技巧就是把形参定义成Collection类型或其子类类型,或者是数组类型,这种方法的缺点就是需要对空参数进行判断和筛选...而 Java 5引入变长参数(varags)就是为了更好地提高方法的复用性,让方法的调用者可以“随心所欲”地传递实参数量,当然变长参数也是要遵循一定规则的, 比如变长参数必须是方法中的最后一个参数;一个方法不能定义多个变长参数等...现在的问题是编译器为什么会首先根据2个int类型的实参而不是1个int类型、1个int数组类型的实参来查找方法呢?...Scala编译器的处理方式就比较“”了,直接抛出“ambiguous reference to overloaded definition” ERROR。...解决方案: scala代码中调用:toJSONString(Object object, SerializerFeature... features) 。 另外,不推荐带有变长参数的方法重载。

1.7K50

挑逗 Java 程序员的那些 Scala 绝技

可能有人会说,就算声明了类型,不也是于事无补吗? ?...Java 的优势在于它的类型可读性,如果声明了 userId 的类型,虽然还是可以正常通过编译,但是代码审查时,这个错误将会更容易被发现。...通过 Scala 提供的集合操作,我们基本上可以实现 SQL 的全部功能,这也是为什么 Scala 能够大数据领域独领风骚的重要原因之一。...便捷的 Tuple 类型 有时方法的返回值可能不止一个,Scala 提供了 Tuple (元组)类型用于临时存放多个不同类型的值,同时能够保证类型安全性。...六、并发编程 挑逗指数: 五星 Scala 中,我们在编写并发代码时只需要关心业务逻辑即可,而不需要关注任务如何执行。我们可以通过或隐方式传入一个线程池,具体的执行过程由线程池完成。

99920

挑逗 Java 程序员的那些 Scala 绝技

可能有人会说,就算声明了类型,不也是于事无补吗?...,如果声明了 userId 的类型,虽然还是可以正常通过编译,但是代码审查时,这个错误将会更容易被发现。...通过 Scala 提供的集合操作,我们基本上可以实现 SQL 的全部功能,这也是为什么 Scala 能够大数据领域独领风骚的重要原因之一。...便捷的 Tuple 类型 有时方法的返回值可能不止一个,Scala 提供了 Tuple (元组)类型用于临时存放多个不同类型的值,同时能够保证类型安全性。...而 Scala 则可以在编译时为值对象生成隐的 Json 编解码器,这些编解码器只不过是普通的函数调用而已,不涉及任何反射操作,很大程度上提升了系统的运行时性能。

2K70

挑逗 Java 程序员的那些 Scala 绝技

可能有人会说,就算声明了类型,不也是于事无补吗?...,如果声明了 userId 的类型,虽然还是可以正常通过编译,但是代码审查时,这个错误将会更容易被发现。...通过 Scala 提供的集合操作,我们基本上可以实现 SQL 的全部功能,这也是为什么 Scala 能够大数据领域独领风骚的重要原因之一。...便捷的 Tuple 类型 有时方法的返回值可能不止一个,Scala 提供了 Tuple (元组)类型用于临时存放多个不同类型的值,同时能够保证类型安全性。...而 Scala 则可以在编译时为值对象生成隐的 Json 编解码器,这些编解码器只不过是普通的函数调用而已,不涉及任何反射操作,很大程度上提升了系统的运行时性能。

1.5K60

Java一分钟之Scala与Java集成

类型推断与类型Scala类型推断可能导致从Java继承或实现时类型不明确的问题。 重载方法解析:Scala的重载解析规则与Java不同,可能导致调用Java重载方法时的意料之外的行为。...标注类型与Java交互的接口处,尤其是构造函数或方法签名中,标注类型可以减少混淆。...) // 输出: Hello, Scala } } Java调用Scala代码 常见问题与易错点 Scala特性的不可见性:如隐转换、模式匹配等Scala特性Java中不可见。...代码示例 Scala伴生对象与: // Scala class ScalaGreeting(val name: String) object ScalaGreeting { def createGreeting...实践这些策略,无论是Scala调用Java还是Java调用Scala,都将变得更加顺畅和高效。

7810

Scala Actors迁移指南

使用restart方法——Akka不提供的重启actors,因此上述例子我们不能提供平滑迁移。用户必须更改系统,所以没有使用重启方法(restart method)。...使用getState方法 - Akka actors没有状态,此功能无法迁移。用户代码必须没有getState调用。...步骤1——万物皆是Actor Scala actors库提供了公共访问多个类型的actors。他们被组织层次结构和每个子类提供了稍微更丰富的功能。...如果用户代码中使用这些信息,那么一个需要:i)应用模式匹配与类型,或者ii)做一个向下的消息来自任何泛型T。...因为ActWithStash中的receive 方法不能在act中像原来那样使用。要使代码通过编译,需要在所有的 receive 调用中加上类型参数。

97520

geotrellis使用(十九)spray-json框架介绍

可以JSON字符串对象、AST(JSON树)对象、Scala类型之间任意转换。        ...spary-json也提供了一些基础类型的转换协议,DefaultJsonProtocol中。...并且MyIntProtocol的定义不能放在调用位置的后面,否则会出错。...此处还需要说明的是基本的case中定义隐变量的时候用的是implicit val,而此处用的是implicit def,个人理解是scala中变量与函数的定义比较模糊,二者基本是等价的,但是此处返回值的类型是泛型...{ "name": "wsf", "age": 26 } 3.5 递归类型转换        如果是case类属性又包含自身,既递归类型定义隐对象的时候稍有不同,需要指明对象的属性,并将

1.3K70

Scala 基础 (五):面向对象(上篇)

一个.java文件 有一个 public Scala中没有 public关键字,默认就是公共的,一个.scala 中可以写多个。声明不能加public,会报错。名不要求和文件名一致。...成员需要Java Bean规范的getter和setter方法的话可以加@BeanProperty相当于自动创建,不需要写出。 给成员属性赋初始值使用_,值类型的值0,引用则是null。...访问权限 Java 中,访问权限分为:public,private,protected 和默认 Scala 中属性和方法的默认访问权限为 public,但 Scala 中无 public 关键字,不用声明...private[包名] 增加包访问权限,包名下的其他也可以使用 创建对象 val 或者 var 对象名 [: 类型] = new 类型() val 修饰对象,不能改变对象的引用(内存地址),可以改变对象属性的值...} } 特点说明: 主构造器定义上,创建对象最先调用的构造器。 辅助构造器用this定义,可以有多个。

30120

Scala教程之:静态类型

类型系统中使用型变允许我们复杂类型之间建立直观的连接,而缺乏型变则会限制抽象的重用性。...隐参数 隐参数由 implicit 关键字标记,方法调用的时候,scala会去尝试获取正确的隐类型值。 Scala查找参数的位置有两个地方: 首先查找可以直接访问的隐定义和隐参数。...上例中第一次调用方法时,我们地提供了类型参数 [Int]。...因此第一个参数必须是 Int 类型,并且返回类型为 List[Int]。 上例中第二次调用方法,表明并不总是需要提供类型参数。编译器通常可以根据上下文或值参数的类型来推断。...类型推断 Scala 编译器通常可以推断出表达式的类型,因此你不必地声明它。

1.3K20

Flink DataStream 类型系统 TypeInformation

但是,某些情况下,例如使用了 Lambda 函数或者泛型类型,必须提供类型信息才能使应用程序正常工作或者提高其性能。...如果一个类型满足如下条件,Flink 就会将它们作为 POJO 数据类型: POJOs 必须是一个公有,Public 修饰且独立定义,不能是内部类; POJOs 中必须包含一个 Public 修饰的无参构造器...但是有时无法提取必要的信息,例如定义函数时如果使用到了泛型,JVM 就会出现类型擦除的问题,使得 Flink 并不能很容易地获取到数据集中的数据类型信息。...此外,某些情况下,Flink 选择的 TypeInformation 可能无法生成最有效的序列化器和反序列化器。因此,你可能需要为你使用的数据类型地提供 TypeInformation。...如下示例是一个提供返回类型的 MapFunction: public static class ResultTypeMapFunction implements MapFunction<String

3.9K51

Scala专题系列(一):Scala基础

3 :scala常用类型 和Java一样,Scala也有七种数值类型 :Byte ,Char,Short,Int,Long,Float和Double以及一个Boolean类型,和Java不同的是这些类型...,Scala并不区分基本类型和引用类型,对于它来讲所以得类型都是一个 Scala中,我们用方法而不是强制类型转换来做数值类型之间的转换 4:方法声明 Scala 中声明方法的结构如下: def hello...Scala 使用类型注解一词表示类似 HashMap 的类型声明。...方法的返回值类型以下情况中必须声明其类型。 – 方法中明显地使用了 return(即使方法末尾也是如此)。 – 递归方法。...– 两个或多个方法重载(拥有相同的函数名),其中一个方法调用了另一个重载方 法,调用者需要类型注解。 – Scala 推断出的类型比你期望的类型更为宽泛,如 Any。

71040

3小时Scala入门

除了Array和ArrayBuffer默认引入的是可变类型外,其它数据结构默认都是不可变的,可以地从scala.collection.mutable引入对应可变容器。 ?...Scala支持非常强大的函数编程风格。 函数编程风格的特点不显使用循环,而是利用高阶函数调用普通函数在数据上进行遍历操作。...如果某个定义时被abstract声明为抽象时,它可以被继承但是不能直接被实例化。 和Python语言不同,Scala每个只能继承一个超。...并且一个良好风格的scala程序中,只需要使用val不可变变量而无需使用var可变变量。 的for或者while循环是不可取的,让我们用更多的高阶函数吧。...5,多范式编程 尽管函数编程是Scala的推荐编程范式,但Scala同时混合了强大的命令编程的功能。 你可以使用强大的for循环,for推导,使用可变的变量和数据类型实现命令编程。

1.6K30

Scala学习路线

为什么? 因为那些真正让Scala具有吸引力、有难度的地方不在上面。比如: 类型系统 函数编程 Monad 也许是因为那些书面向的都是初学者,在这些方面都讲得比较简略,点到即止。...但是混用的过程还是比较痛苦的: 很多,特别是集合,Java与Scala各有一套,我们需要不停转换 Java与Scala类型系统不完全相同,有时候会遇到奇怪的编译错误 有些java库会对javabean...由于我也刚刚开始学习函数编程,没法给出准确的描述,只能大概说一些:纯函数编程中不能使用像 for 循环这样的语法,也不能给一个变量重新赋值,所以它解决问题的思路跟我们在过程式语言中做的,有很大不同...但是实际情况是,如果不能尽早的掌握足够的类型系统知识,使用Scala时我们几乎寸步难行。我们在编译Scala代码时,遇到的最多错误就是各种类型不匹配,如果不熟悉的话,可能要卡几个小时都解决不了。...所以最开始学习的时候,就不能回避它。也许我们的目的不是设计出一个类型很复杂的库,我们也要能做到看得懂复杂一点的方法签名,解决常见的类型编译错误。

2.3K50

3小时Scala入门

除了Array和ArrayBuffer默认引入的是可变类型外,其它数据结构默认都是不可变的,可以地从scala.collection.mutable引入对应可变容器。 ?...Scala支持非常强大的函数编程风格。 函数编程风格的特点不显使用循环,而是利用高阶函数调用普通函数在数据上进行遍历操作。...如果某个定义时被abstract声明为抽象时,它可以被继承但是不能直接被实例化。 和Python语言不同,Scala每个只能继承一个超。...并且一个良好风格的scala程序中,只需要使用val不可变变量而无需使用var可变变量。 的for或者while循环是不可取的,让我们用更多的高阶函数吧。...5,多范式编程 尽管函数编程是Scala的推荐编程范式,但Scala同时混合了强大的命令编程的功能。 你可以使用强大的for循环,for推导,使用可变的变量和数据类型实现命令编程。

3.5K20

3小时Scala入门

除了Array和ArrayBuffer默认引入的是可变类型外,其它数据结构默认都是不可变的,可以地从scala.collection.mutable引入对应可变容器。 ?...Scala支持非常强大的函数编程风格。 函数编程风格的特点不显使用循环,而是利用高阶函数调用普通函数在数据上进行遍历操作。...如果某个定义时被abstract声明为抽象时,它可以被继承但是不能直接被实例化。 和Python语言不同,Scala每个只能继承一个超。...并且一个良好风格的scala程序中,只需要使用val不可变变量而无需使用var可变变量。 的for或者while循环是不可取的,让我们用更多的高阶函数吧。...5,多范式编程 尽管函数编程是Scala的推荐编程范式,但Scala同时混合了强大的命令编程的功能。 你可以使用强大的for循环,for推导,使用可变的变量和数据类型实现命令编程。

1.6K30

大数据利器--Scala语言学习(基础)

1) Any 是所有的根类型,即所有的父(基) 2) Scala分为两个大的类型分支(AnyVal [值类型,即可以理解成就是 java 的基本数据类型],AnyRef 类型)...Null null 可以赋值给任意引用类型(AnyRef),但是不能赋值给值类型 Nothing Nothing类型Scala层级的最低端;它是任何其他类型的子类型。...1) lazy 不能修饰 var 类型的变量 2) 不但是调用函数时,加了 lazy ,会导致函数的执行被推迟,我们声明一个变量时,如果给声明了 lazy ,那么变量值得分配也会推迟。...5) scala 中没有 public 关键字,即不能用 public 的修饰属性和方法。...1) 其所带的 构造参数有且只能有一个 2) 隐必须被定义”或“伴生对象”或“包对象”里,即隐不能是顶级的(top-level objects) 3) 隐不能是 case class

1K10

Scala | 教程 | 学习手册 --- 首函数

First Class Functions 函数编程的核心就是函数应当是首的。首表示函数不仅能得到声明和调用,还可以作为一个数据类型用在这个语言的任何地方。...首函数与其他数据类型一样,可以采用字面量创建;或者存储值、变量、或数据结构等容器中;还可以作为一个函数的参数或返回值。...用通配符为函数赋值 通配符下划线相当于占位符,表示将来的一个函数调用。要么使用类型,要么使用通配符_定义函数值以及用函数赋值。...(null, (s: String) => s.reverse) res7: String = null 事实上,f的类型定义完之后,可以从函数字面量中删除类型。...可以以下情况使用: 函数的类型字面量之外指定 参数最多只用1次 scala> val doubler: Int => Int = _ * 2 doubler: Int => Int = <function1

37620

Scala 高级类型

高级类型 1. 视界(“类型”) 有时候,你并不需要指定一个类型是等/子/超于另一个,你可以通过转换这个来伪装这种关联关系。一个视界指定一个类型可以被“看作是”另一个类型。...隐函数允许类型自动转换。更确切地说,函数可以帮助满足类型推断时,它们允许按需的函数应用。...可是 Scala 的数字类型并不都共享一个超,所以我们不能使用T <: Number。相反,要使之能工作,Scala 的 math 库对适当的类型 T 定义了一个隐含的 Numeric[T]。...然后 List 定义中使用它: sum[B >: A](implicit num: Numeric[B]): B 如果你调用List(1,2).sum(),你并不需要传入一个 num 参数;它是隐设置的...但如果你调用 List(“whoop”).sum(),它会抱怨无法设置 num。 没有设定陌生的对象为 Numeric 的时候,方法可能会要求某种特定类型的“证据”。

7710
领券