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。
欢迎使用本黄鸭编写的小程序~
微信公众号二维码:
领取专属 10元无门槛券
私享最新 技术干货