1、什么是stream流
stream流的使用,是建立在Lambda表达式的基础上
可以看做是数据流在管道中传输,并且可以在管道的节点上进行处理
+--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+
2、生成流
在Java8中,集合接口有两个方法来生成流:
stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。
3、节点操作
forEach
迭代流中的每个数据
map
用于映射每个元素到对应的结果
filter
用于通过设置的条件过滤出元素
limit
用于获取指定数量
sorted
用于对流进行排序
Collectors
实现了很多归约操作,例如将流转换成集合和聚合元素
4、流的常用场景
1)将数组 ["a","B","a"] 转换Map。对应key为小写,value为大写,结果:{"a":"A","b":"B"}
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
String str[] = new String[] {"a","B","a"};
List<String> lists = Stream.of(str).collect(Collectors.toList()); //将数组转换成list
//将list转换成map
//(o1, o2) -> o1)表示如果有key相同,则取第一个元素
Map<String, String> map = lists.stream().collect(Collectors.toMap(t->t.toLowerCase(), t->t.toUpperCase(), (o1, o2) -> o1));
for(String key : map.keySet()) {
System.out.println(key + " " + map.get(key));
}
}
}
2)将map中key转化为大写,value转为小写
原Map: {"a":"A","b":"B"}
结果Map: {"A":"a","B":"b"}
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
Map<String, String> map2= new HashMap<>();
map.put("a", "A");
map.put("b", "B");
map.forEach((k,v)->{
map2.put(k.toUpperCase(), v.toLowerCase());
});
for(String key : map2.keySet()) {
System.out.println(key + " " + map2.get(key));
}
}
}
5、stream不会改流的底层数据,即流入的原始数据
6、stream().map()和stream().forEach()的区别
stream().map()和stream().forEach()都可以遍历集合。
(1)数组要转成list或者set才能使用stream流。
(2)stream().map(),遍历集合,对集合每一个元素产生新的数据,可以作为流的中间环节。不会对原来的list中的元素做出任何改变。
(3)stream().forEach(),遍历集合,对集合中的所有元素做处理,会改变原来的list中的元素。
Arrays.asList(byteBuffers).stream().map(buffer -> buffer.flip()); //无效
Arrays.asList(byteBuffers).stream().forEach(buffer -> buffer.flip()); //有效
7、这代码读起来就像在读英文:"过滤出年龄大于18岁的用户,然后映射到他们的名字,最后收集成列表"
// Lambda写法:声明式编程
List<String> names = users.stream()
.filter(user -> user.getAge() > 18)
.map(User::getName)
.collect(Collectors.toList());
8、函数式编程
传递行为而不是数据
本文详细介绍了Java8中的Stream流概念,包括其作为数据在管道中传输的特性,以及如何通过filter、map、sorted等节点操作进行数据处理。通过实例展示了如何将数组转换为Map以及如何在不改变原始数据的情况下操作Map。此外,还对比了stream().map()和stream().forEach()的区别,强调了map()作为中间操作不会影响原始数据,而forEach()则可能改变原有集合状态。
1556

被折叠的 条评论
为什么被折叠?



