《Scala函数式编程》认为常见的副作用包括: 修改一个变量 直接修改数据结构 设置一个对象的成员 抛出一个异常或以一个错误终止 打印到终端或读取用户的输入 读取或写入一个文件 在屏幕上绘画 例如,读取花名册文件对内容进行解析获得收件人电子邮件列表的函数为...同时,该副作用使得我们无法根据输入参数推断函数的返回结果,因为读取文件可能出现一些未知的错误,如读取文件错误,又或者有其他人同时在修改该文件,就可能抛出异常或者返回一个不符合预期的邮件列表。...具有引用透明特征的纯函数更加贴近数学中的函数概念:没有计算,只有转换。转换操作不会修改输入参数的值,只是基于某种规则把输入参数值转换为输出。...我们可以简单地将一个Monad理解为提供bind功能的容器。在Scala语言中,bind功能就是flatMap函数。可以简单地将flatMap函数理解为是map与flattern的组合。...对同一个列表执行相同的转换函数,但调用flatMap函数: scala> l.flatMap(lang => lang.toCharArray) res6: List[Char] = List(s, c
可选的 catch 绑定 1.1 介绍 在 ECMAScript2019 最新提案中,支持我们在使用 trycatch 错误异常处理时,选择性的给 catch传入参数。...// todo } catch { // todo } 1.2 使用场景 当我们不需要对 catch 返回的错误信息进行处理时,比如:我们对于一些数据处理,经常会出现格式报错,但是我们并不关心这个错误...JSON.superset 2.1 介绍 来源背景: 由于在 ES2019 之前不支持转义行分隔符 ( \u2028) 和段落分隔符 ( \u2029) 字符,并且在解析过程中会报错: SyntaxError...Function.prototype.toString 4.1 介绍 在 ES10 之前,我们对一个函数调用 toString() 方法,返回的结果中会将注释信息去除。...,返回一个新字符串,表示从其(右)端剥去空白的调用字符串,不会直接修改原字符串本身。
可选的 catch 绑定 1.1 介绍 在 ECMAScript2019 最新提案中,支持我们在使用 try catch 错误异常处理时,选择性的给 catch 传入参数。...// todo } catch { // todo } 1.2 使用场景 当我们不需要对 catch返回的错误信息进行处理时,比如:我们对于一些数据处理,经常会出现格式报错,但是我们并不关心这个错误...JSON.superset 2.1 介绍 来源背景: 由于在 ES2019 之前不支持转义行分隔符 (\u2028) 和段落分隔符 (\u2029) 字符,并且在解析过程中会报错: SyntaxError...Function.prototype.toString 4.1 介绍 在 ES10 之前,我们对一个函数调用 toString() 方法,返回的结果中会将注释信息去除。...,返回一个新字符串,表示从其(右)端剥去空白的调用字符串,不会直接修改原字符串本身。
我在文章《并非Null Object这么简单》中已经阐释了这个问题。然而不仅仅是空指针异常,当程序代码中出现各种错误时,我们的处理方式该如何呢? 现在,让我们再看看Scala语法层面的Option。...就是要对可能出现的错误(空对象,索引越界,类型转换异常)进行判断。...当然,我们可以运用防御式编程,将可能的错误防御在正常逻辑代码之前,但它带来的阅读体验却会非常糟糕。 即使针对这些错误进行判断,仍然无法解决的一个问题是当对象真的出现错误时,函数实现究竟该如何处理?...多数语言不支持多返回值(乃至不支持类似Scala的Pair),经典的解决办法就是抛出异常,可惜,异常却存在副作用。许多程序员更习惯性的返回了null。...惯常说来,当我们在使用Option时,习惯于利用模式匹配(pattern match)以运用“分而治之”的思想来编写代码。
我们使用响应式架构主要是为解决多个系统间的多次远程调用带来的分布式问题,尤其在长任务场景中,响应式架构显得尤其必要。 有赞连锁出现后,随着连锁商家经营规模的扩张,会在系统中创建新的门店。...)); 整个商品处理流程就是上面这段代码,一目了然,后面扩展可以自己在中间加入处理流程,也可以在对应业务方法中修改逻辑。...自动降级:传统编程方法中,自动降级处理,意味着我们代码中会出现一大堆try/catch,而使用 rxjava,我们可以直接定义当流处理异常时,程序需要怎么做,这样的代码看起来非常简洁。...由于商品列表页展示的信息涉及到多服务数据的整合,一方面需要保证整个接口的 rt,另一方面不希望由于一个商品数据或外部服务的异常影响到整个商品列表的加载。因此该场景非常适用于 RxJava。 ?...目前我们对响应式架构的实践方式是:在系统间使用消息中间件来进行实现,在系统内则使用 RxJava 实现异步化和响应式编程。对于响应式架构的思想,我们也在探索阶段,并在部分业务场景进行实践。
之后在Java社区就出现了RxJava和Akka Stream等技术方案,让Java平台在反应式编程上有了多种选择。...onError(Exception) 处理完成 hasNext() onCompleted() Publisher推送数据给Subscriber,触发onNext()方法,在处理完成或发生异常时触发onCompleted...Publisher发生异常时,触发Subscriber的onError()方法,进行异常捕获处理。...,数据访问都必须使用Reactive API,在存储层目前Reactive只支持MongoDB,Redis和Couchbase等几种不支持事务管理的NoSql,需要注意。...实践建议 在使用lambda写处理函数时,如果多个处理函数可能缺乏可读性且不易于维护。可以将相关处理函数分组到一个处理程序或控制器类中。
---- 在Optional出现之前经常遇到的空指针异常 NullPointerException 这个你总不能说你没有碰到过吧 【Person / Car / Insurance 的数据模型】 public...更糟糕的是,发生 null 时返回的默认值,即字符串“Unknown”在三个不同的地方重复出现——出现拼写写错误的概率不小!当然,你可能会说,我们可以用把它们抽取到一个常量中的方式避免这种问题。...不过get 方法在遇到空的 Optional 对象时也会抛出异常,所以不按照约定的方式使用它,又会让我们再度陷入由 null 引起的代码维护的梦魇。...使用流时, flatMap 方法接受一个函数作为参数,这个函数的返回值是另一个流。这个方法会应用到流中的每一个元素,最终形成一个新的流的流。 但是 flagMap 会用流的内容替换每个新生成的流。...,我们从它的签名就能非常清楚地知道无论是 person 还是 car ,它的值都有可能为空,出现这种情况时,方法的返回值也不会包含任何值。
10 } 11 return ratio; 12 } 在写这段java程序时一个疑问立即跳了出来:如果出现了错误时这个函数该返回什么呢?...=> B表示输入参数B是拖延计算的,意思是在函数内部真正参考(refrence)这个参数时才会对它进行计算。 下面通过一些使用案例来说明: 1 //在管子里相加。...那么我们如何保证在调用现有java库的同时又可以不影响泛函编程风格呢?我们需不需要在使用java函数时用null和Exception而在Scala中就用Option呢?答案是否定的!...实际上我们现在泛函编程中的风格要求是在调用某个函数时,这个函数要能接受Option类型传入参数及返回Option类型值。...下面看看Option的函数组合(function composition):map2用一个函数f在Option管道内把两个Option合并起来: 1 def map2[A,B,C](a:
MongoDB从诞生以来就争议不断,总结一下主要有一下几点: Schemaless 不支持事务 默认忽略错误 默认关闭认证 会导致数据丢失 其实Schemaless和不支持事务是技术选型时的决定,不应该受到吐槽...2.2 开发示例 2.2.1 定义Model和Controller 在定义Model时最好显式声明_id属性,因为该属性为MongoDB的默认主键,如果没有,在插入时会自动生成。...内可以直接使用MongoController定义的方法和属性,例如database。...表示真实被修改的记录数量(不包含更新值和原值相同的记录,因为这些记录其实并没有被修改),UpdateWriteResult.upserted返回被upserted的记录_id列表。...在使用update方法时,千万别忘记$set操作符,否则会造成数据丢失。
(x => [x * 2]); // [2, 4, 6, 8] // 只会将 flatMap 中的函数返回的数组 “压平” 一层 arr1.flatMap(x => [[x * 2]]); // [...5.Object.fromEntries() Object.entries()方法的作用是返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于...而Object.fromEntries() 则是 Object.entries() 的反转。 Object.fromEntries() 函数传入一个键值对的列表,并返回一个带有这些键值对的新对象。...在 matchAll 出现之前,通过在循环中调用regexp.exec来获取所有匹配项信息(regexp需使用/g标志: const regexp = RegExp('foo*','g'); const... catch 绑定 在 ES10 之前,我们必须通过语法为 catch 子句绑定异常变量,无论是否有必要。
Optional 类 JDK1.8开始引入的特性,Optional 类主要解决空指针异常(NullPointerException)问题。...举例: User类的结构 String isocode = user.getAddress().getCountry().getIsocode().toUpperCase(); 在避免出现空指针的情况下...= null) { isocode = isocode.toUpperCase(); } } } } 在避免了空指针异常的情况下...( () -> name)); // 输出Ber orElse() 和 orElseGet()的区别 在Optional对象为不为空时,两个方法都返回相应的非空值,但orElse()方法任创建了默认值对象...() 如果一个值存在,应用提供的 Optional映射函数给它,返回该结果,否则返回一个空的 Optional 。
问题分析 如上异常,抛异常的代码在BodyExtractors的201行,根据异常堆栈信息找到对应的代码分析: private static S readWithMessageReaders...后,在默认的JSON解码器里是不支持,导致抛出了不支持的MediaType异常。...定位到真实原因后,博主给出了如下方案 解决方案 方案一 如果服务端是自己的服务,可以修改服务端的程序指定ContentType为application/json类型返回即可。...如果是第三方的服务,没法改动server端请参考下面的方案 方案二 使用String接收后,然后在flatMap里在过滤自己解码一遍,String类型可以接收application/octet-stream...而最终异常也是因为json解码器不支持导致的,所以我们可以定制json解码器,重写支持的MediaType校验规则 自定义解码器 /** * @author: kl @kailing.pub
/数组构造时, 将数组表达式或者 string 在语法层面展开;还可以在构造对象时, 将对象表达式按 key-value 的方式展开。...在构造字数组时, 可以在任意位置多次使用。...('0.0'.padEnd(10,'0')) 5.函数参数列表结尾允许逗号 主要作用是方便使用 git 进行多人协作开发时修改同一个函数减少不必要的行变更。...,在正则表达式中使用标记 u (unicode) 设置,在 \p块儿内,可以以键值对的方式设置需要匹配的属性而非具体内容。...,与 JSON 匹配 以前,这些符号在字符串文字中被视为行终止符,因此使用它们会导致 SyntaxError 异常。
前言 在开发中,我们常常需要对一个引用进行判空以防止空指针异常的出现。Java8引入了Optional类,为的就是优雅地处理判空等问题。...下面,我们就来了解下Optional的常用用法 Optional方法列表 Optional的方法列表如下: 初始化 初始化一个Optional有三种方式,如下: // 创建一个空的optional Optional...不存在,则抛出异常。 在业务开发的时候,经常会对一个引用进行判空,如果为空,则采用异常流的形式处理业务逻辑。...中是编译不过的,会提示有受检异常未处理。...其与map的区别在于:map是把结果自动封装成一个Optional,但是flatmap需要你自己去封装。
除非传入的操作函数有副作用, 函数本身不会对数据源进行任何修改. distinct distinct保证数据源中的重复元素在结果中只出现一次, 它使用equals()方法判断两个元素是否相等...., 只有使断言函数返回真的元素才会出现在结果中. filter不会对数据源进行修改....与map不同flatMap进行多对一映射, 它要求若数据源的元素类型为R, 则mapper函数的返回值必须为Stream. flatMap会使用mapper函数将数据源中的元素一一映射为Stream...对象, 然后把这些Stream拼装成一个流.因此我们可以使用flatMap进行合并列表之类的操作: List list = Stream.of( Arrays.asList(1),...流可以在非线程安全的集合上创建, 流操作不应该对非线程安全的数据源产生任何副作用, 否则将发生java.util.ConcurrentModificationException异常.
执行代码块:包含在一对大括号中,出现在操作符的右侧 2.2.2 变量的访问操作 1.匿名内部类: 说明:在匿名内部类中,this代表的是匿名内部类,而不是LambdaApp这个类 public class...-->MyInterface.strategy(T t,R r),strategy函数需要一个T类型和一个R类型, 我们在把MyInterface当作类型传递给参数时,确定了它的T类型和R类型,确定了它的...总结:JVM会根据代码在运行过程中的上下文进行检测,在这里test需要一个MyInterface类型的参数,在调用test时我们传递了一个lambda表达式, MyInterface就是lambda...表达式的目标类型,接下来会继续根据lambda表达式与绑定的接口进行类型参数的推导,在类型参数进行推导时, 会验证lambda表达式中的参数个数与顺序是否和接口中定义的参数类型和顺序一致,一致的情况下按照参数的顺序进行确认...但flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装。
使用场景:可以使用该操作符封装需要被多次执行的函数。...重做结束才会发出 onCompleted() 通知,若重做过程中出现异常则会中断并发出 onError() 通知。 使用场景:可使用该操作符指定满足一定条件时重复执行一个任务,如发送多次网络请求等。...Observable对象的序列出现异常时,不直接发出 onError() 通知,而是重新订阅该 Observable对象,直到重做过程中未出现异常,则会发出 onNext() 和 onCompleted...()通知;若重做过程中也出现异常,则会继续重试,直到达到重试次数上限,超出次数后发出最新的 onError() 通知。...extends R> func); 把源 Observable 发射的元素应用于指定的函数,并发送该函数的结果。
需要注意的是,使用这些函数时,一定要保证函数内的所有内容都可以被序列化。如果有一些不能被序列化的内容,或者使用接下来介绍的Rich函数类,或者重写Java的序列化和反序列化方法。...自定义函数最终归结为重写函数flatMap,函数的两个参数也与输入输出的泛型类型对应,即参数value的是flatMap的输入,数据类型是T,参数out是flatMap的输出,我们需要将类型为O的数据写入...使用TraversableOnce也导致我们无论如何都要返回一个列表,即使是一个空列表,否则无法匹配函数的定义。...Seq.empty } } } 在使用Lambda表达式时,我们应该逐渐学会使用Intellij Idea的类型检查和匹配功能。...比起普通的函数类,Rich函数类增加了: open()方法:Flink在算子调用前会执行这个方法,可以用来进行一些初始化工作。
前言 在开发中,我们常常需要对一个引用进行判空以防止空指针异常的出现。Java8引入了Optional类,为的就是优雅地处理判空等问题。...Optional方法列表 Optional的方法列表如下: image.png 初始化 初始化一个Optional有三种方式,如下: // 创建一个空的optional Optional异常。 在业务开发的时候,经常会对一个引用进行判空,如果为空,则采用异常流的形式处理业务逻辑。...中是编译不过的,会提示有受检异常未处理。...其与map的区别在于:map是把结果自动封装成一个Optional,但是flatmap需要你自己去封装。
这个结构与Java的集合体系非常相似。 Scala 中的集合是分成可变和不可变两类集合的,其中可变集合就是说,集合的元素可以动态修改,而不可变集合的元素在初始化之后,就无法修改了。...ArrayBuffer 就类似于 Java中的 ArrayList。 List List 代表一个不可变的列表。 ...Scala 的集合类的 map、flatMap、reduce、reduceLeft、foreach 等这些函数,就是高阶函数,因为可以接收其他函数作为参数。 ...高阶函数的使用,也是 Scala 与Java 的不同。因为 Java 里面是没有函数式编程的,也肯定没有高阶函数,也肯定无法直接将函数传入一个方法,或者让一个方法返回一个函数。...:统计多个文本内的单词总数 val line1 = scala.io.Source.fromFile("C://Users//12895//Desktop//text1.txt").mkString val
领取专属 10元无门槛券
手把手带您无忧上云