stream流的三类方法
- 获取Stream流
○ 创建一条流水线,并把数据放到流水线上准备进行操作 - 中间方法
○ 流水线上的操作
○ 一次操作完毕之后,还可以继续进行其他操作 - 终结方法
○ 一个Stream流只能有一个终结方法
○ 是流水线上的最后一个操作
其实Stream流非常简单,只需要将其理解为一条流水线即可,然后在不同的时期去做不同的操作。
获取流-如何生成流
生成Stream流的方式:
- Collection体系集合
使用默认方法stream()生成流,default Stream stream()
- Map体系集合
把Map转成Set集合,间接的生成流entrySet().stream() 或者 keySet().stream()
- 数组
通过Arrays中的静态方法stream生成流Arrays.stream(T Values)
- 同种数据类型的多个数据
通过Stream接口的静态方法of(T... values)
生成流
stream流的中间操作方法
中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作(“每次中间操作完成后返回的仍然是stream流”)
方法名 | 说明 |
Stream filter(Predicate predicate) | 用于对流中的数据进行过滤 |
Stream limit(long maxSize) | 返回此流中的元素组成的流,截取前指定参数个数的数据 |
Stream skip(long n) | 跳过指定参数个数的数据,返回由该流的剩余元素组成的流 |
static Stream concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
Stream distinct() | 返回由该流的不同元素(根据Object.equals(Object) )组成的流 |
stream流的终结方法
终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作(“即方法操作后返回的对象不再是一个stream对象”)
方法名 | 说明 |
void forEach(Consumer action) | 对此流的每个元素执行操作 |
ong count() | 返回此流中的元素数 |
stream流的收集方法
- 概念
对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中 - 常用方法
方法名 说明
R collect(Collector collector) 把结果收集到集合中
- 工具类Collectors提供了具体的收集方式
方法名 | 说明 |
public static Collector toList() | 把元素收集到List集合中 |
public static Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper,Function valueMapper) | 把元素收集到Map集合中 |
一些使用Stream流的例子
- 找出数组中的偶数并遍历输出
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
list.add(8);
list.add(9);
list.add(10);
list.stream().filter(s->0 == s%2).forEach(s-> System.out.println(s));
- 根据字符串数组中的元素按照逗号
,
的位置将数据提取出来,并且要求年龄>24,然后将结果进行输出
List<String> list = new ArrayList<>();
list.add("zhangsan,23");
list.add("lisi,24");
list.add("wangwu,25");
Map<String, Integer> collect = list.stream()
.filter(s -> 24 <= Integer.parseInt(s.split(",")[1]))
.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
System.out.println(collect);
- 将字符串数组中数组元素的信息按照
,
分离出来,并且进行过滤,然后封装到对应的实体类actor
中
实体类(name , age):
package com.robin.mystream;
public class Actor {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Actor(String name, Integer age) {
this.name = name;
this.age = age;
}
public Actor() {
}
@Override
public String toString() {
return "Actor{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.robin.mystream;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class StreamDemo3 {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
list1.add("张三,23");
list1.add("李四,24");
list1.add("王麻子,25");
list1.add("二狗子,27");
list1.add("狗剩,22");
list1.add("德柱子,21");
List<String> list2 = new ArrayList<>();
list2.add("张晓丽,28");
list2.add("翠芬,27");
list2.add("杨如花,23");
list2.add("杨似玉,26");
list2.add("马兰花,32");
list2.add("杨大嘴,22");
// 将姓名为3个字的人的信息过滤出来,并且只输出两个
Stream<String> stream1 = list1.stream()
.filter(s -> s.split(",")[0].length() == 3)
.limit(2);
// 将姓杨的人过滤出来,并且不要第一个姓杨的
Stream<String> stream2 = list2.stream()
.filter(s -> s.split(",")[0].startsWith("杨"))
.skip(1);
// 将两次结果合并起来
Stream<String> streamConcat = Stream.concat(stream1, stream2);
streamConcat.forEach(act->{
Actor actor = new Actor(act.split(",")[0], Integer.parseInt(act.split(",")[1]));
System.out.println(actor);
});
}
}