继续操练Stream,直接上代码:
而咱们要返回ArrayList,显示可以用构造引用来传递到里面,因为它刚好符合Supplier函数式接口的特性:不接收参数返回一个值,所以:
接下来试着将Stream转换成其它集合类型,比如:Set,如下:
接下来将集合中的字符串元素拼成一起然后再输出出来,继续可以用stream.collect()方法来实现,如下:
下面提出新的需求,对其集合中的所有字符串元素转换成大写,然后再输出出来,具体如何用stream来实现呢?
接着继续,将一个整数集合中的元素进行平方之后再打印出来,很简单,直接上代码:
对于Stream而言,除了用map可以映身之后,还有一个flatMap(),flat是平面的意思,那这个方法用在什么场合之下呢?先来看一下下面的这个Stream:
如果此时想把这些集合元素里面数据进行平方然后再输出出来,这时该怎么办呢?当然这时map()方法已经无法达到映射的目的了,这时flatMap()就派上用场了,它就是会将集合元素打平,也就是可以理解将这些不同的集合元素打散放到一个最终的集合中,所以说可以这样整:
这时元素就已经是打散了,而不是分散在不同的List中了,这时就再可以配合map来对其进行数据映射啦,如下:
进一步看出使用了Stream()之后既简便可读性又好,如果采用传统的方法来实现上面的要求那得多次循环,然后弄一些临时变化等等。
接下来再来学习一下stream的其它方法:
其中Supplier是不接收参数返回一个值,这里创建一个UUID的Stream,如下:
接着对其进行输出,这里又涉及到一个新的方法,如下:
其中看一下findFist()方法:
而对于Optional在之前也对它进行学习过,它是用来避免空指针的,而它里面的get()方法就可以拿到具体值,如下:
那思考一下为啥这个findFirst()方法返回的是一个Optional对象,而非一个具体的值呢?就是为了避免空指针嘛,因为当流里面木有元素的时候,那findFirst()肯定是不存的,另外目前使用Optional的方式不是标准的写法,之前也强调过,IDE对目前的写法也给出提示了,如下:
所以改成正确的写法:
如果咱们改成一个空的Stream,看会不会报错?
接下来再来学习一下Stream的另外一个新接口,如下:
先来看一下它的定义:
而回顾一下UnaryOperator接口的原型:
接着看一下它的Javadoc:
根据这个javadoc初步的能感觉到用这个方法可以生成一个指定规则生成的数列,所以下面来使用一下它:
但是此时生成的是一个无限流,因为我们没有对这个流做任何限制,所以这时的输出当然就是无限循环喽:
所以一般如果要用到流的这个迭待方法,一定要给它加一个限制,如何限制呢?
其中查看一下limit()方法: