什么是Stream流
JDK8开始新增的一套API,可以用于链式操作集合或者数组的数据。
优势: Stream流大量的结合了Lambda的语法风格来编程,功能强大,性能高效,代码简洁,可读性好。
list.stream().filter(s -> s.startswith("张")).filter(s -> s.Length() == 3).collect(Collectors.toList());
使用Stream流
- 获取Stream流。(开启)
- 调用流水线的各种操作。(处理)
- 获取处理的结果。(终结)
获取Stream流(开启)
// 集合
// default Stream <E> stream()
List<String> list = new ArrayList<>();
list.stream();
// ===============
// 数组
// public static <T> Stream<T> stream(T[] array)
// public static <T> Stream<T> of(T... values)
String[] names = {"1","2","3"};
Arrays.stream(names);
// 或者
Stream.of(names);
扩展:可变参数
public static <T> Stream<T> of(T... values)
- 三个点代表可变参数,
数据类型…参数名称
,可以匹配多个参数或者一个数组。 - 可变参数在形参列表中只能有一个,且可变参数必须放在形参列表的最后面。
- 可变参数对内实际上就是一个数组。下面中nums就是数组。
public static void sum(int age, int...nums){
System.out.println(nums.Length);
System.out.println(Arrays.toString(nums));
}
- 可以不传数据给可变参数;也可以传一个或者同时传多个数据给它。常常用它来灵活地接收数据。
Stream流的常用中间方法
中间方法:用完方法返回一个新流,继续链式编程。
Stream提供的常用中间方法 | 说明 |
---|---|
Stream |
用于对流中的数据进行过滤 |
Stream |
对元素进行升序排序 |
Stream |
按照指定规则排序 |
Stream |
获取前几个元素 |
Stream |
跳过前几个元素 |
Stream |
去除流中重复的元素 |
对元素进行加工,并返回对应的新流 | |
static |
合并a和b两个流为一个流 |
其中,map方法是映射加工方法,把流上原来的数据拿出来变成新数据又放到流上去。 |
scores.stream().sorted().forEach(System.out::println);
scores.stream().sorted((s1,s2) -> Double.compare(s2,s1)).forEach(System.out::println);
scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).limit(2).forEach(System.out::println);// 取前两名
scores.stream().sorted((s1, s2) -> Double.compare(s2, s1)).skip(2);// 跳过前两名
scores.stream().map(s -> "加10分后:" + (s +10)).forEach(System.out::println);// 每人加10分
Stream流的常用终结方法
终结方法指的是调用完成后,不会返回新Stream了,没法继续使用流了。
流只能用一次!终结后就不能用了。
Stream提供的常用终结方法 | 说明 |
---|---|
void forEach(Consumer action) | 对此流运算后的元素执行遍历 |
long count() | 统计此流运算后的元素个数 |
Optional |
获取此流运算后的最大值元素 |
Optional |
获取此流运算后的最小值元素 |
注意:max,min返回的是Optional对象,需要使用
.get()
获取这个对象。
Stream流的收集
就是把Stream流操作后的结果转回到集合或者数组中去返回。
list.stream().filter(s -> s.startsWith("3k")).collect(Collector.toList());
Stream提供的常用终结方法 | 说明 |
---|---|
R collect(Collector collector) | 把流处理后的结果收集到一个指定的集合中去 |
Object[] toArray() | 把流处理后的结果收集到一个数组中去 |
Collectors工具类提供了具体的收集方式 | 说明 |
---|---|
public static |
把元素收集到List集合中 |
public static |
把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |