专注于分布式,性能优化,代码之美

Stream流与Optional类学习

Stream流与Optional类

Stream流:

Stream类似NET的Linq表达式,可以对集合数据进行筛选、过滤和映射数据等一系列操作

创建Stream流:

1、通过Stream接口中的静态工厂创建:of、generator、iterate

of方法:

支持可变长参数创建

支持与单一参数创建

 

generate方法:

生成一个无限长度的Stream,其元素的生成是通过给定的Supplier函数

 

iterate方法:

和generate一样也是生成一个无限长度Stream,和generate不同的是,iterate的入参为

Stream<T> iterate(final T seed, final UnaryOperator<T> f)

将seed作为入口,不断将结果放入第二个函数中,seed,f(seed),f(f(seed)),f(f(f(seed)))...

例如:

Stream.iterate(1, x -> x+1)
最后生成的元素如下:1,2,3,4,5...

注:使用generate和iterate方法时,一定要配合limit方法进行截断,否则会无线延长

 

2、通过Collection接口中的默认方式创建:collection.stream()

在Java8中接口引入了default标识符,可以为接口定义默认方法

转换Stream流:

1、distinct():

去重操作,将Stream流转换成一个没有重复数据的新Stream,如果集合中自定义对象,必须重写hashCode和equals)

 

2、limit(int maxSize):

获取Stream流的前maxSize个元素转换成新Stream

 

3、filter(Predicate<? super T> predicate):

根据Predicate函数进行过滤操作,返回新Stream

 

4、map(Function<? super T, ? extends R> mapper):

对于Stream中包含的元素使用给定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素

 

5、flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):

和map类似,不同的是其每个元素转换得到的都是Stream对象,会把一个个Stream中的元素压缩到父集合中

 

6、peek(Consumer<? super T> action):

生成一个包含原Stream的所有元素的新Stream,同时会提供一个消费函数(Consumer函数),新Stream每个元素被消费的时候都会执行给定的消费函数(只会消费被转换函数执行到的元素)

 

7、skip(long n):

返回一个丢弃原Stream的前N个元素后剩下元素组成的新Stream,如果原Stream中包含的元素个数小于N,那么返回空Stream

匹配、聚合操作

allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false
noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false
anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false
findFirst:返回流中第一个元素
findAny:返回流中的任意元素
count:返回流中元素的总个数
max:返回流中元素最大值
min:返回流中元素最小值

收集操作

collect(Collector<? super T, A, R> collector):

接收一个Collector实例,将流中元素收集成另外一个数据结构

例子:

List<Integer> list = Arrays.asList(1,2,3,2,null,4,null,5);
List<Integer> collect = list.stream().filter(x -> x != null).distinct().map(x -> x * 2).skip(2).limit(2).collect(Collectors.toList());
最后collect的值为:[6, 8]

Optional类:
Optional 类主要解决的问题是空指针异常

创建Optional对象

1、Optional.of(T t):创建一个Optional实例,如果t为null,则会抛出异常

2、Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例

3、Optional.empty():创建一个空的 Optional 实例

访问 Optional 对象的值

1、get() :从 Optional 实例中取回实际值对象的方法

判断是否包含值

1、isPresent():判断是否有值,有值返回true,无值返回false

2、ifPresent(Consumer<? super T> consumer):判断是否有值,如果有值就执行Consumer函数

返回默认值

1、orElse(T t):如果调用对象包含值,返回该值,否则返回t

2、orElseGet(Supplier<? extends T> other):如果调用对象包含值,返回该值,否则返回 Supplier函数获取的值

3、orElseThrow(Supplier<? extends X> exceptionSupplier):如果调用包含值,返回改值,否知执行Supplier抛出异常

转换值

1、map(Function<? super T, ? extends U> mapper):如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()

2、flatMap(Function<? super T, Optional<U>> mapper):与 map 类似,要求返回值必须是Optional

过滤值

1、filter(Predicate<? super T> predicate):接受一个 Predicate参数,返回结果为 true 的值。如果结果全为 false,会返回一个空的 Optional

posted on 2021-02-06 09:04  xiaohouye  阅读(457)  评论(0编辑  收藏  举报

导航

今日之劳累是为了铸造明日之辉煌,不管年龄多少,都无法阻挡我对软件艺术的追求!