Java基础之《Stream流》

本文详细介绍了Java8中的Stream流概念,包括其作为数据在管道中传输的特性,以及如何通过filter、map、sorted等节点操作进行数据处理。通过实例展示了如何将数组转换为Map以及如何在不改变原始数据的情况下操作Map。此外,还对比了stream().map()和stream().forEach()的区别,强调了map()作为中间操作不会影响原始数据,而forEach()则可能改变原有集合状态。

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、函数式编程
传递行为而不是数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值