快速入门Stream流

要操作Stream流 首先要有个数据源,可以是数组或者集合,每次操作都会返回一个新的流对象,方便进行链式操作

创建流

如果是数组的话,可以使⽤ Arrays.stream() 或者 Stream.of() 创建流;如果是集合的话,
可以直接使⽤ stream() ⽅法创建流

  1. 从集合创建Stream
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream = list.stream();
  1. 从数组创建Stream
String[] array = {"apple", "banana", "cherry"};
Stream<String> stream = Arrays.stream(array);
  1. 从静态方法创建Stream
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);

流的操作类型:

中间操作:

可以有多个中间操作,每次返回一个新的流,可进行链式调用。例如:filter、map、distinct、sorted、limit。

1)过滤
filter()筛选出你要的数据
使用lambda表达式传递参数

list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);                                      

Stream<String> stream = list.stream().filter(element ->              
element.contains("王"));

distinct():去重

list.stream().distinct().forEach(System.out::println);

2)映射
map()将原来流中的元素根据传递的参数,转换成新的流的元素
这里在map中传递了String::length,表示取列表中每个元素的长度,并返回成新的流

public class MapStreamDemo {
public static void main(String[] args) {                                                
List<String> list = new ArrayList<>();
list.add("周杰伦");
list.add("王⼒宏");
list.add("陶喆");
list.add("林俊杰");
Stream<Integer> stream = list.stream().map(String::length);
stream.forEach(System.out::println);
 }
}

3)匹配
Stream 类提供了三个⽅法可供进⾏元素匹配,它们分别是:
anyMatch() ,只要有⼀个元素匹配传⼊的条件,就返回 true。
allMatch() ,只有有⼀个元素不匹配传⼊的条件,就返回 false;如果全部匹配,则返回
true。
noneMatch() ,只要有⼀个元素匹配传⼊的条件,就返回 false;如果全部不匹配,则返回
true。

public class MatchStreamDemo {
public static void main(String[] args) {    
List<String> list = new ArrayList<>();
list.add("周杰伦");
list.add("王⼒宏");
list.add("陶喆");
list.add("林俊杰");
boolean anyMatchFlag = list.stream().anyMatch(element ->
element.contains("王"));
boolean allMatchFlag = list.stream().allMatch(element ->
element.length() > 1);
boolean noneMatchFlag = list.stream().noneMatch(element ->
element.endsWith("沉"));
System.out.println(anyMatchFlag);
System.out.println(allMatchFlag);
System.out.println(noneMatchFlag);
 }
}

因为“王⼒宏”以“王”字开头,所以 anyMatchFlag 应该为 true;因为“周杰伦”、“王⼒宏”、“陶
喆”、“林俊杰”的字符串⻓度都⼤于 1,所以 allMatchFlag 为 true;因为 4 个字符串结尾都不是
“沉”,所以 noneMatchFlag 为 true。

终端操作:

只能有一个,终端操作会触发流的实际计算,并终止流的使用。例如:foreach、collect、anyMatch、allMatch等。

forEach(): 对每个元素执行操作
list.stream().forEach(System.out::println);
collect(): 收集结果(通常用于转换为集合)
使用.Stream可以将集合或者数组转成流,那么 通过.collect()方法则能将Stream流转回列表,使用toArray() ⽅法可以将流转换成数组
Collectors 是⼀个收集器的⼯具类,内置了⼀系列收集器实现,⽐如说 toList() ⽅法将元素收
集到⼀个新的 java.util.List 中;⽐如说 toCollection() ⽅法将元素收集到⼀个新的
java.util.ArrayList 中;⽐如说 joining() ⽅法将元素收集到⼀个可以⽤分隔符指定的字
符串中。

List<Integer> list1 =
list.stream().map(String::length).collect(Collectors.toList());      

List<String> list2 =
list.stream().collect(Collectors.toCollection(ArrayList::new));

String[] strArray = list.stream().toArray(String[]::new);

PS:学习内容来自沉默王二的Java进阶之路以及个人总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值