Lambda表达式-Stream流


一、流式思想

当需要对多个元素进行操作的时候,考虑到性能及便利性,会拼好一个“模型”步骤方案,再按照方案去执行它。
在这里插入图片描述
此处中间体的Lazy操作就相当于下面代码的filter组合操作,集合元素并没有真正被处理。只有当终结方法forEach执行的时候,整个模型才会按照指定策略执行操作。
这就是Lambda的延迟执行特性。
在这里插入图片描述
列举一些常见的中间操作和终结操作

中间操作(Intermediate):
map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered、concat

终结操作(Terminal):
forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 iterator anyMatch、 allMatch、 noneMatch、 findFirst、 findAny

如果我们强行再终结操作之后继续对stream进行操作的话,会报出IllegalStateException异常:
在这里插入图片描述

二、如何获取流

// List转换为Stream流
List<String> list = new ArrayList<>();
Stream<String> streamlist = list.stream();

// Set转换为Stream流
Set<String> set = new HashSet<>();
Stream<String> streamSet = set.stream();

// 获取Set的键
Map<String, String> map = new HashMap<>();
map.put("123","123");
Stream<String> streamKeySet = map.keySet().stream();

// 获取Collection的值
Collection<String> collection = map.values();
Stream<String> streamCollection = collection.stream();

// 获取键值对(键与值之间的映射关系entrySet)
Set<Map.Entry<String, String>> entries = map.entrySet();
Stream<Map.Entry<String, String>> stream = entries.stream();

// 把数组转换为Stream流
Stream<Integer> streamArr01 = Stream.of(1, 2, 3, 4, 5);

Integer[] arr = {1, 2, 3, 4, 5};
Stream<Integer> streamArr02 = Stream.of(arr);

String[] arr2 = {"a", "bb", "ccc"};
Stream<String> streamArr03 = Stream.of(arr2);

三、Stream流常用API

1. forEach

该方法接收一个 Consumer 接口函数,会将每一个流元素交给该函数进行处理:

void forEach(Consumer<? super T> action);

之前的博客中有讲到:Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据。

forEach具体示例如下:
在这里插入图片描述

2. map

该方法可以将流中的元素映射到另一个流中:

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

之前的博客中有讲到:Function 函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。主要用的是里面唯一的抽象方法 R apply(T t);,它将一种T类型转换成为R类型,这种转换的动作,就称为“映射”。

map具体示例如下:
在这里插入图片描述

3. filter

该方法可以将一个流转换成另一个子集流:

Stream<T> filter(Predicate<? super T> predicate);

之前的博客中有讲到:Predicate唯一的抽象方法boolean test(T t);,将会产生一个boolean值结果,代表指定的条件是否满足。如果结果为true,那么Stream流的 filter 方法将会留用元素;如果结果为false,那么 filter 方法将会舍弃元素。

filter具体示例如下:
在这里插入图片描述

4. count

该方法用来统计个数,具体示例如下:
在这里插入图片描述

5. collect

该方法可以收集流中的数据到集合或者数组中去,具体示例如下:
在这里插入图片描述

6. limit

该方法可以对流进行截取,只取用前n个,具体示例如下:
在这里插入图片描述

7. skip

该方法可以跳过前n个,然后取到一个截取之后的新流,具体示例如下:
在这里插入图片描述

8. concat

该方法可以将两个流合并成为一个流,具体示例如下:
在这里插入图片描述

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

建桥之魂

建桥人,建桥魂,建桥都是人上人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值