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

理解Scala的函数式风格:从var到val的转变

如果你来自于指令式的背景,如Java,C++,或者C#,你或许认为var是很正统的变量而val是一种特殊类型的变量。...相反,如果你来自于函数式背景,如Haskell,OCamel,或Erlang,你或许认为val是一种正统的变量而var有亵渎神灵的血统。...然而在Scala看来,val和var只不过是你工具箱里两种不同的工具。它们都很有用,没有一个天生是魔鬼。Scala鼓励你学习val,但也不会责怪你对给定的工作选择最有效的工具。...重构后的printArgs方法并不是纯函数式的,因为它有副作用——本例中,其副作用是打印到标准输出流。函数有副作用的马脚就是结果类型为Unit。...Scala程序员的平衡感 崇尚val,不可变对象和没有副作用的方法。 首先想到它们。只有在特定需要和判断之后才选择var,可变对象和有副作用的方法。

1.1K30

lombok的val

满足是发明创造的窒息物——佚名 kt中的val让我用的爱不释手,不用重复定义一个又一个类型,编译器会自动推导 今天遇到一个情况,我们知道把java代码粘贴到kt文件里,idea会自动转换java为kt...但反过来将kt代码粘贴到java文件里则不会,原来的val,现在还是val 这时候可以使用lombok的val:https://projectlombok.org/features/val 例如下面的代码会被编译为合适的类型...: import java.util.ArrayList; import java.util.HashMap; import lombok.val; public class ValExample...; val foo = example.get(0); return foo.toLowerCase(); } public void example2() { val...System.out.printf("%d: %s\n", entry.getKey(), entry.getValue()); } } } 要注意一个细节,对于复合类型,推断的通常是父类

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

    【Scala篇】--Scala中的函数

    一、前述 Scala中的函数还是比较重要的,所以本文章把Scala中可能用到的函数列举如下,并做详细说明。 二、具体函数 1、Scala函数的定义 ?...,要指定传入参数的类型 方法可以写返回值的类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数中或者函数的返回值是函数类型的时候。  ...scala中函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数的返回值。...如果返回值可以一行搞定,可以将{}省略不写 传递给方法的参数可以在方法中使用,并且scala规定方法的传过来的参数为val的,不是var的。...** * 包含默认参数值的函数 * 注意: * 1.默认值的函数中,如果传入的参数个数与函数定义相同,则传入的数值会覆盖默认值 * 2.如果不想覆盖默认值,传入的参数个数小于定义的函数的参数

    1.5K10

    Scala 高阶(十):Scala中的异常处理

    Java中异常处理有两种方式 try...catch和finally概述 finally重要面试题 三、Scala中的异常机制 ---- Scala中的异常机制语法处理上和 Java 类似,但是又不尽相同...中的异常机制 将会发生异常的代码封装在 try 块中。...Scala 的异常的工作机制和 Java 一样,但是 Scala 没有“checked(编译期)”异常,即 Scala没有编译异常这个概念,异常都是在运行的时候捕获处理。...因此,在 catch 子句中,越具体的异常越要靠前,越普遍的异常越靠后,如果把越普遍的异常写在前,把具体的异常写在后,在 Scala 中也不会报错,但这样是非常不好的编程风格。...它向调用者函数提供了此方法可能引发此异常的信息。它有助于调用函数处理并将该代码包含在 try-catch块中,以避免程序异常终止。在 Scala 中,可以使用 throws 注解来声明异常。

    1.1K40

    Scala 高阶(九):Scala中的模式匹配

    常量 类型 数组 列表 元组 对象及样例类 四、声明变量中的模式匹配 五、for表达式模式匹配 六、偏函数模式匹配 ---- 本次主要分享Scala中关于模式匹配的内容,Scala中的模式匹配类似于Java...中的switch语法,但是Scala在基于Java的思想上补充了特有的功能。...构造器中的每一个参数都成为 val修饰的变量 object Test_MatchCaseClass { def main(args: Array[String]): Unit = { val...五、for表达式模式匹配 元组中取元素时,必须用_1 _2 …,可以用元组赋值将元素赋给变量 指定特定元素的值,可以实现类似于循环守卫的功能 object TestMatchFor { def main...// map转换 key不变 value两倍 val newList = list.map(tuple => (tuple._1, tuple._2 * 2)) // 模式匹配 对元素元素赋值

    1.5K30

    jquery的html,text,val

    一 意义:     1.html()用为读取和修改元素的HTML标签     2.text()用来读取或修改元素的纯文本内容     3.val()用来读取或修改表单元素的value值。...二 这三个方法功能上的对比 .html(),.text(),.val()三种方法都是用来读取选定元素的内容; 只不过.html()是用来读取元素的HTML内容(包括其Html标签),.text()用来读取元素的纯文本内容...,包括其后代元素,.val()是用来读取表单元素的"value"值。....html(htmlString),.text(textString)和.val(value)三种方法都是用来替换选中元素的内容,如果三个方法同时运用在多个元素上时,那么将会替换所有选中元素的内容。....html(),.text(),.val()都可以使用回调函数的返回值来动态的改变多个元素的内容。

    1.5K20

    Java中对map按key或val排序

    首先先看下Java中的Collections.sort()排序方法: Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:     public...super T> c) {         list.sort(c);     } 通过实现Comparator接口的compare方法来完成自定义排序 Comparator 的使用有两种方式: Collections.sort... int compare(Student o1, Student o2) {         return o1.getId() - o2.getId();     } }); 根据Mapval...>中的key排序map,排序完成后放进linkedHashMap中,也可以放在List中,因为map的话,返回到前端顺序会乱。     ...tmpEntry.getKey(), tmpEntry.getValue());               }           }           return sortedMap;      } 根据val

    1.6K10

    jQuery中,html、val与text的区别与联系

    文章作者:Tyan 博客:noahsnail.com  |  CSDN  |  简书 本文主要介绍如何使用jQuery中的html(),text()和val()三种方法,用于读取、修改元素的html...1. html方法 不带参数的html方法 在html方法不带参数的情况下,取得的是html内容。...val方法 不带参数的val方法 html页面代码: jquery代码: console.log($('#test').val());...结果:Hello 带参数的val方法 jquery代码: $('#test').val('Test'); 结果: 总结:html方法可以获取...(修改)控件的文本,也可以获取(修改)控件内嵌套的html元素,text方法主要是用来获取控件(修改)的文本,而val方法主要是针对具有value属性的控件,可以获取(修改)控件的value值。

    69940

    聊聊kotlin的val跟var

    了解kotlin,最先接触的就是val跟var了,下面详细说说这两个字段的特性 val val:英文读value,代表是immutable, 只读的意思 比如下面这个kotlin代码 val item...getItem() { return this.item; } 声明了一个final的String,并且设置了一个get方法,确实说明了val的修饰的变量,只能赋值一次,后续无法再次赋值 如果我在前面加个...方法没有了 其实这种写法,真的是非常的优雅; 对于java来说,很多人声明一个变量的时候,常常忘记加final修饰语,从而埋下了隐患,比如这个变量传到其他方法中,或者再其他的使用中,不小心给他重新赋值,...或者把这个变量置空,导致了其他不可预期的问题 但是kotlin只需要一个val就可以快速实现这个特性,很方便优雅 这一点,在java的圣经《Effective Java》中,也有提及,叫做: Minimize...所以使用val是一种更安全,更不容易出错的写法,再后续的开发中,应该尽量使用val修饰符 就像里面所说的 var var:英文读variable,变量的意思,也就是指的mutable 比如下面这个kotlin

    1.2K20

    搞懂JavaScript中的连续赋值

    搞懂JavaScript中的连续赋值 前段时间老是被一道题刷屏,一个关于连续赋值的坑。 遂留下一个笔记,以后再碰到有人问这个题,直接丢过去链接。。...再来说上边的那道题,我一次看到这个题的时候,答案也是错了,后来翻阅资料,结合着调试,也算是整明白了-.- 前两行的声明变量并赋值,使得a和b都指向了同一个地址({ n: 1 }在内存中的位置) 为了理解连续赋值的运行原理...我们从代码的第一行开始,画图,一个图一个图的来说: let a = { n: 1 }声明了一个变量a,并且创建了一个Object:{ n: 1 },并将该Object在内存中的地址赋值到变量a中,这时就能通过...执行表达式(a.x = a = { n: 2 }),取出a.x的位置,由于a的值为{ n: 1 },所以取属性x为undefined,遂在内存中开辟一块新的空间作为({ n: 1}).x的位置: ?...执行剩余表达式(a = { n: 2 }),取出a的位置,因为a是一个已声明的变量,所以该步骤并不会有什么改变; 执行剩余表达式({ n: 2 }),为{ n: 2 }在内存中开辟一块空间存放数据:

    74110

    搞懂JavaScript中的连续赋值

    搞懂JavaScript中的连续赋值 前段时间老是被一道题刷屏,一个关于连续赋值的坑。 遂留下一个笔记,以后再碰到有人问这个题,直接丢过去链接。。...再来说上边的那道题,我一次看到这个题的时候,答案也是错了,后来翻阅资料,结合着调试,也算是整明白了-.- 前两行的声明变量并赋值,使得a和b都指向了同一个地址({ n: 1 }在内存中的位置) 为了理解连续赋值的运行原理...我们从代码的第一行开始,画图,一个图一个图的来说: let a = { n: 1 }声明了一个变量a,并且创建了一个Object:{ n: 1 },并将该Object在内存中的地址赋值到变量a中,这时就能通过...执行表达式(a.x = a = { n: 2 }),取出a.x的位置,由于a的值为{ n: 1 },所以取属性x为undefined,遂在内存中开辟一块新的空间作为({ n: 1}).x的位置: ?...执行剩余表达式(a = { n: 2 }),取出a的位置,因为a是一个已声明的变量,所以该步骤并不会有什么改变; 执行剩余表达式({ n: 2 }),为{ n: 2 }在内存中开辟一块空间存放数据:

    4.1K71

    Javascript 中的解构赋值语法

    首先在 ES6中引入的“解构赋值语法”允许把数组和对象中的值插入到不同的变量中。虽然看上去可能很难,但实际上很容易学习和使用。 数组解构 数组解构非常简单。...你所要做的就是为数组中的每个值声明一个变量。你可以定义更少的变量,而不是数组中的索引(即,如果你只想解处理前几个值),请跳过某些索引或甚至使用 REST 模式将所有剩余的值放到新数组中。...// Skip a value (12) ...n // n = [12, 15] ] = nums; 对象解构 对象解构与数组解构非常相似,主要区别是可以按名称引用对象中的每个...,所以可以通过使用索引作为对象解构分配中的 key,用解构分配语法从数组中获取特定值。...用这种方法还可以得到数组的其他属性(例如数组的 length)。最后,如果解构后的值是 undefined,则还可以为解构过程中的变量定义默认值。

    1.1K30
    领券