目录
- Java8 Stream流
- 一、Stream概述
- 二、Stream 的创建(4种方式)
- 参考地址(表示感谢):
Java8 Stream流
一、Stream概述
-
Stream API说明
- Java8中有两大最为重要的改变。第一个是
Lambda 表达式
;另外一个则是Stream API
。 Stream API (java.util.stream) 把真正的函数式编程风格引入到Java中
。正是因为他的出现,lambda出现的频率才更多了一点。
- Java8中有两大最为重要的改变。第一个是
-
Stream API作用
实际开发中,项目中多数数据源都来自于Mysql,Oracle等。但现在数据源可以更多了,有MongDB,Redis等,而这些NoSQL的数据就需要Java层面去处理。这时候就可以用stream来对返回的集合数据进行复杂的操作,例如分页、筛选、去重等等…
-
Stream 和 Collection 集合的区别
Collection
是一种静态的内存数据结构,而Stream
是有关计算的。前者是主要面向内存,存储在内存
中,后者主要是面向CPU
,通过 CPU 实现计算。
-
Stream 操作分为三个步骤
- 1、创建 Stream:通过数据源(如:集合、数组),获取一个流
- 2、中间操作:对数据源的数据进行处理,处理可能是执行很多操作,所以形成了一个操作链。
- 3、终止操作(终端操作)
一旦执行终止操作,就执行中间操作链
,并产生结果。
-
注意
Stream是流,自己不会存储元素
,而是按照特定的规则对数据进行计算,一般会输出结果。Stream 不会改变源对象
。相反,他们会返回一个持有结果的新Stream、或者新的集合。- stream具有延迟执行特性,
只有调用终端操作时,中间操作才会执行
。 - stream是流,
一旦执行终止操作,就关流了,所以就不允许再对流进行操作了
,否则直接报错,但是可以对流计算出来的结果进行操作。
二、Stream 的创建(4种方式)
-
创建 Stream方式一:通过集合
Java8 中的 Collection 接口被扩展,提供了两个获取流的方法:
default Stream< E> stream()
: 返回一个顺序流default Stream< E> parallelStream()
: 返回一个并行流
List<String> list = Arrays.asList("a", "b", "c"); // 创建顺序流的两种方式 Stream<String> stream = list.stream(); Stream<String> sequential = list.stream().sequential(); // 创建一个并行流的两种方式 Stream<String> parallel = list.stream().parallel(); Stream<String> stringStream = list.parallelStream();
-
创建 Stream方式二:通过数组
Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:
-
static < T> Stream< T> stream(T[] array)
: 返回一个流重载形式,能够处理对应基本类型的数组:
-
public static IntStream stream(int[] array)
-
public static LongStream stream(long[] array)
-
public static DoubleStream stream(double[] array)
;
int[] array = {1,3,5,6,8}; IntStream stream = Arrays.stream(array);
-
-
创建 Stream方式三:通过Stream的of()
可以调用Stream类静态方法 of(), 通过显示值创建一个流。它可以接收任意数量的参数。
public static< T> Stream< T> of(T... values)
: 返回一个流
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
-
创建 Stream方式四:创建无限流
可以使用静态方法 Stream.iterate() 和 Stream.generate(), 创建无限流。
- 迭代:
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
- 生成:
public static<T> Stream<T> generate(Supplier<T> s)
public static void main(String[] args) { // 迭代 // public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) Stream<Integer> stream = Stream.iterate(0, x -> x + 2); stream.limit(10).forEach(System.out::println); // 生成 // public static<T> Stream<T> generate(Supplier<T> s) Stream<Double> stream1 = Stream.generate(Math::random); stream1.limit(10).forEach(System.out::println); }
- 迭代:
参考地址(表示感谢):
https://blog.csdn.net/weixin_43888891/article/details/124657128