面向对象的编程-Application 21

Previously on OOP:

There are four ways to sort in reverse order. Additionally, it is beneficial to employ the exclusive method to select a termination process of a Stream.

在开始新的内容之前,本黄鸭对于sort in reverse order有一点补充。想要使用reverseOrder(), reversed(), and comparing()等函数,都必须要.java文件的开头import一个库类文件:

这个库类文件是需要重点记忆的,最好能背出来。因为在编译器报错的时候,提供的选项非常多,很难一下子找到正确的。

下面,我们来分析几个其他termination process的代码。今天看第一组:接在findAny()函数后面的三种termination processes。

第一步还是把String类型的、名叫txt的变量按照空格分开,转存进一个叫做txta的数组。split()函数的参数可以是字符,比如空格符号,回车符号,tab符号,等;也可能是regular expression,即用公式化、代号化的方式来表示字符串的结构。虽然在本课程的理论部分中,有一些非常难的regular expression,但是考试的时候只要掌握最基础的,就不会有太大的问题。

Solution 1

在前文的一个Stream的例子中,我们使用了:

把数组转化为Stream。本段代码却没有用这种方式,而是采用了“Stream.of()”。这两种方法没有功能上的区别,只是Stream.of()当参数为空的时候,会产生Exception in execution time。

接着是一个filter函数,凡是长度大于10的字符串都会被保留,其他的都会被踢掉。然后就是findAny()函数,即看一看有没有任何长度大于10的字符串。这个函数被Java语言规定,不能作为termination process。

最后是termination process,ifPresent(),也就是如果有长度大于10的字符串的话,那么就执行ifPresent()的参数部分的代码,打印出任意一个(一般是第一个)长度大于10的字符串。相反地,如果没有长度大于10的字符串,直接终止Stream的执行,并且什么都不会打印出来。

Solution 2

在findAny()之后的termination process还可以是orElse()函数。如果没有找到任何一个字符串的长度大于10,那么就执行orElse()参数部分的代码,即打印出“”字符串。

相反地,如果找到了长度大于10的字符串,那么orElse()分支就不会走到,直接终止Stream的执行,并在本段代码的最后一行打印出任意一个长度大于10的字符串。

Solution 3

最后一种方案非常花哨,而且超越了考试的要求,所以各位宝宝们不必太过纠结。在没有找到长度大于10的字符串的情况下,会执行orElseGet()参数部分的代码:

新建一个存放String类型数据的数组,没有名字,里面的元素分别是:“nope”,“sorry”, and“you found nothing”。再用Math.random()产生随机数,作为无名数组的下标。运行的效果是随机打印三个字符串中的一个。

orElseGet()的参数部分应该是一个Lambda expression,那么它是哪一个Interface的子类的实例呢?必须在API library中查找orElseGet()的参数的类型,在本黄鸭印象中是Optional。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181023G1R8I100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券