Java8 Stream使用

247 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第31天,点击查看活动详情

Stream创建

  • IntStream
  • LongStream
  • DoubleStream

stream 和 parallelStream 区别

  • stream 是顺序流,由主线程按顺序对流执行操作
  • parallelStream 是并行流,内部以多线程并行执行的方式对流进行操作,但前提是流中的数据处理没有顺序要求

通过Collection系列集合提供的方法

default Stream<E> stream():返回一个顺序流

  • Stream<String> stream = list.stream();

default Stream<E> parallelStream():返回一个并行流

  • Stream<String> stream = list.parallelStream();

通过Arrays数组提供的方法

static <T> Stream<T> stream(T[] array):返回一个流

  • Stram<User> stream = Arrays.stream(new User[10]);

build

public static<T> Builder<T> builder()

empty

public static<T> Stream<T> empty():返回一个空的顺序 Stream,该 Stream 里面不包含元素项

  • Stream<Object> empty = Stream.empty();

of(T t)

public static<T> Stream<T> of(T t):通过 Stream 的静态方法 of(),返回含有一个 T 元素的 Stream

of(T... values)

public static<T> Stream<T> of(T... values) :通过 Stream 的静态方法 of(),返回一个流

  • 底层实现:Arrays.stream(values);
  • Stream<String> stream = Stream.of("aa","bb","cc");

iterate

public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) :返回一个无限长度的 Stream,通过函数 f 迭代对给指定的元素种子而产生无限连续有序 Stream,其中包含的元素可以认为是:seed,f(seed),f(f(seed))无限循环

  • iterate 跟 reduce 操作很像,接受一个种子值,和一个 UnaryOperator(例如 f)。 然后种子值成为 Stream 的第一个元素,f(seed) 为第二个,f(f(seed)) 第三个,以此类推。 在 iterate 时候管道必须有 limit 这样的操作来限制 Stream 大小
  • Stream <Integer> stream = Stream.iterate(0,(x)-> x+2).forEach(System.out::println);
  • 生成一个等差队列:Stream.iterate(2, n -> n + 2);

generate

public static<T> Stream<T> generate(Supplier<T> s):返回一个无限长度的 Stream,其元素由 Supplier 接口的提供

  • 生成无限长的随机数:Stream.generate(() -> Math.rondom());

lines

public static Stream<String> lines(Path path) throws IOException :文件生成流,每个元素是给定文件的其中一行