要操作Stream流 首先要有个数据源,可以是数组或者集合,每次操作都会返回一个新的流对象,方便进行链式操作
创建流
如果是数组的话,可以使⽤ Arrays.stream() 或者 Stream.of() 创建流;如果是集合的话,
可以直接使⽤ stream() ⽅法创建流
- 从集合创建Stream
List<String> list = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream = list.stream();
- 从数组创建Stream
String[] array = {"apple", "banana", "cherry"};
Stream<String> stream = Arrays.stream(array);
- 从静态方法创建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进阶之路以及个人总结