stream流
java.util.stream.Stream是java8新加入的流接口
获取流非常的简单,由一下几种常用的方式
1. 创建操作
- 可以通过collection系列提供的Stream()
List<String> list=new ArrayList<>();
Stream<String> stream = list.stream();
- 可以通过Arrays中静态方法stream()获取数组流
Integer[] integers=new Integer[10];
Stream<Integer> stream1 = Arrays.stream(integers);
- 可以通过Stream类中的静态方法of创建流 这里of是可变参数
Stream<String> stream2=Stream.of();
Stream<String> stream2=Stream.of("aaa","bbbb");
- 或者创建无限流
1.用迭代器的方法
Stream<Integer> stream3 = Stream.iterate(0, (x) -> x + 2);
stream3.forEach(System.out::println);
2.用生成的方法
Stream.generate(()->Math.random()).forEach(System.out::println);
2.中间操作
就拿Employee类来举例子
List<Employee> emp = Arrays.asList(
new Employee("张三", 18, 9999),
new Employee("李四", 5, 7777),
new Employee("王五", 45, 3333),
new Employee("赵六", 38, 6666)
);
filter接收lambda 从流中排除某些元素。排除上边年龄大于30岁的人,但是只有下面的代码运行不出来,因为少了一个操作 终止操作(终端操作)
Stream<Employee> stream = emp.stream().filter(employee -> {
System.out.println("Stream API中间建操作");
return employee.getAge() > 30;
});
把这些大于30岁的人给遍历出来 终止操作会把全部内容一次性执行完毕 所以称为 **惰性求值**
stream.forEach(System.out::println);
limit截断流 使其不会超过指定数量
以上边的无限流做示例
Stream<Integer> stream3 = Stream.iterate(0, (x) -> x + 2);
stream3.limit(2).forEach(System.out::println);
因为limit底层是 最大是几个 我把它限制为2个
Stream<T> limit(long maxSize);
skip(n)- 跳过元素 返回一个扔掉了前面n个元素的流 若流中的元素不足n 则返回一个空 与limit互补
意思是 limit截取6个Integer类型的数字 skip会把前两个给丢弃掉
Stream<Integer> stream3 = Stream.iterate(0, (x) -> x + 2);
stream3.limit(6)
.skip(2)
.forEach(System.out::println);