Stream操作流

介绍

什么是操作流

  • 操作流类似于一个高级的迭代器,但是只能遍历一次。在流的过程中,我们可以对流进行一些操作,比如过滤和获取一些符合要求的元素等。
  • 操作流一般与新增的Lambda表达式一同使用,用于简化一些基本操作

操作流的类型(在单个语句中)

  1. 中间操作,接收一个流对象,返回一个流对象(便于进行链式操作)
  2. 终端操作,只能有一个且在语句末尾
1
2
3
4
5
6
7
8
9
//示例建议看完下文再来
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
list.add("apple");

long count = list.stream().distinct().count();
System.out.println(count);

distinct()方法是一个中间操作(去重),它会返回一个新的流(流中没有共同元素)

1
Stream<T> distinct();

count()方法是一个终端操作,返回流中的元素的个数

1
long count()
  • 注意:终端操作不会立即被执行,只有等到终端操作时,流才真正地开始遍历。换句话说就是,一次遍历执行多个操作。

创建流

1
2
3
4
5
6
7
8
9
10
11
12
//情况一:数组创建流
String[] arr = new String[]{"apple","banana","orange"};
Stream<String> stream = Arrays.stream(arr);
//情况二:集合创建流
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
stream = list.stream();
//情况三:直接创建
Stream<String> stream = Stream.of("apple","banana","orange");

流操作

1
2
3
4
5
6
7
8
9
10
11
12
13
public class StreamDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("周杰伦");
list.add("王力宏");
list.add("陶喆");
list.add("林俊杰");
//过滤操作(含有“王”的字符串)
Stream<String> stream = list.stream().filter(element -> element.contains("王"));
//
stream.forEach(System.out::println);
}
}

过滤(filter)

filter()方法接收一个Predicate类型(新增的一个函数式接口,在之后Lambda表达式章节会细讲)

待续……