Stream流
stream流的概述
-
在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念。
-
目的:用于简化集合和数组操作的[[API]]。
-
案例:体验Stream流的作用
//体验Stream流的作用
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Demo01 {
public static void main(String[] args) {
//1.创建一个集合,存储多个字符串元素
List<String> list1 = new ArrayList<>();
list1.add("张三丰");
list1.add("张无忌");
list1.add("周芷若");
list1.add("赵敏");
list1.add("张强");
//2.把集合中所有以"张"开头的元素存储到一个新的集合
ArrayList<String> zhanglist1 = new ArrayList<>();
for (int i = 0;i<list1.size();i++) {
String s = list1.get(i);
if (s.startsWith("张")) {
zhanglist1.add(s);
}
}
System.out.println(zhanglist1);
//3.把"张"开头的集合中的长度为3的元素存储到一个新的集合
ArrayList<String> zhanglist2 = new ArrayList<>();
for (int i = 0;i<zhanglist1.size();i++) {
String s = zhanglist1.get(i);
if (s.length()==3) {
zhanglist2.add(s);
}
}
System.out.println(zhanglist2);
//4.遍历上一步得到的集合中的元素输出。
for (String zhanglist3:zhanglist2) {
System.out.println(zhanglist3);
}
System.out.println("================================");
//使用stream流来进行上述要求操作
//1.匿名内部类
/*Stream<String> stream = list1.stream();
Stream<String> zhangStream = stream.filter(new Predicate<String>() { @Override public boolean test(String s) { if (s.startsWith("张")) {
return true; } return false; } }); List<String> collect = zhangStream.collect(Collectors.toList()); System.out.println(collect);*/
//2.[[lambda表达式]]
List<String> coll = list1.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).collect(Collectors.toList());
System.out.println(coll);
}
}
- Stream流的思想
- 先得到集合或者数组的Stream流(就是一根传送带)
- 把元素放上去
- 然后就用这个Stream流简化的API来方便的操作元素。
Stream流的获取
- Stream流的三类方法:
- 获取Stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作
- 中间方法
- 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
- 终结方法
- 一个Stream流只能有一个终结方法,是流水线上的最后一个操作
- 获取Stream流
Stream流的常用API
名称 | 说明 |
---|---|
Stream<T> filter(Predicate<? super T> predicate) | 用于对流中的数据进行过滤 |
Stream<T> limit(long maxSize) | 获取前几个元素 |
Stream<T> skip(long n) | 跳过前几个元素 |
Stream<T> distinct() | 去除流中重复的元素。依赖(hashCode和equals方法) |
static <T> Stream<T> concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
import com.zhou.day0906.Dog;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class Demo03 {
public static void main(String[] args) {
List<Dog> dogs = new ArrayList<>();
dogs.add(new Dog("哈士奇",1));
dogs.add(new Dog("哈士奇",1));
dogs.add(new Dog("哈士奇",3));
dogs.add(new Dog("柯基",4));
Stream<Dog> stream1 = dogs.stream().distinct();
Stream<Dog> stream2 = dogs.stream().filter((a) -> {
return a.getAge() > 2;
});
Stream.concat(stream1,stream2).forEach((a)->{
System.out.println(a);
});
}
}
-
中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。
-
在Stream流中无法直接修改集合、数组中的数据。
-
Stream流的常见终结操作方法
|名称|说明|
|–|–|
|void forEach(Consumer action)
|对此流的每个元素执行遍历操作|
|long count()
|返回此流中的元素数| -
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
收集Stream流
-
收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去。
-
Stream流:方便操作集合/数组的手段。
-
集合/数组:才是开发中的目的。
- Stream流是操作集合/数组的手段
- 操作的结果数据最终要恢复到集合或者数组中去。