Java9新特性系列(Stream改进)

844 阅读2分钟

Java8的Stream

在Java8中,一个比较大的变化就是流(Stream),具体可以看之前的一篇文章:Java8新特性系列(Stream)

Java9的Stream

Java9中Stream增加了4个方法,分别是:

  • takeWhile:在有序的Stream中,takeWhile返回从开头开始的尽量多的元素
default Stream<T> takeWhile(Predicate<? super T> predicate) {
    Objects.requireNonNull(predicate);
    // Reuses the unordered spliterator, which, when encounter is present,
    // is safe to use as long as it configured not to split
    return StreamSupport.stream(
        new WhileOps.UnorderedWhileSpliterator.OfRef.Taking<>(spliterator(), true, predicate),
            isParallel()).onClose(this::close);
}
  • dropWhile:与takeWhile相反
default Stream<T> dropWhile(Predicate<? super T> predicate) {
    Objects.requireNonNull(predicate);
    // Reuses the unordered spliterator, which, when encounter is present,
    // is safe to use as long as it configured not to split
    return StreamSupport.stream(
        new WhileOps.UnorderedWhileSpliterator.OfRef.Dropping<>(spliterator(), true, predicate),
            isParallel()).onClose(this::close);
}
  • ofNullable:可以创建一个单元素Stream,可以为null
public static<T> Stream<T> ofNullable(T t) {
    return t == null ? Stream.empty()
         : StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
  • iterate
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f) {
    Objects.requireNonNull(f);
    Spliterator<T> spliterator = new Spliterators.AbstractSpliterator<>(Long.MAX_VALUE,
    Spliterator.ORDERED | Spliterator.IMMUTABLE) {
        T prev;
        boolean started;

        @Override
        public boolean tryAdvance(Consumer<? super T> action) {
            Objects.requireNonNull(action);
            T t;
            if (started)
                t = f.apply(prev);
            else {
                t = seed;
                started = true;
            }
            action.accept(prev = t);
            return true;
        }
    };
    return StreamSupport.stream(spliterator, false);
}

除了对 Stream 本身的扩展,Optional和Stream之间的结合也得到了改进,可以将optional对象转化为stream对象:

List<String> list = new ArrayList<>() {{
    add("a");add("b");add("c");
}};
Optional<List<String>> optional = Optional.ofNullable(list);
Stream<List<String>> stream = optional.stream();
stream.flatMap(x -> x.stream()).forEach(System.out::println);

使用举例

  • takeWhile
List<Integer> list = Arrays.asList(1, 4, 5, 2, 3, 6, 7, 8, 9, 10);
list.stream().takeWhile(x -> x < 5).forEach(System.out::println);

输出:
1
4

  • dropWhile
List<Integer> list = Arrays.asList(1, 4, 5, 2, 3, 6, 7, 8, 9, 10);
list.stream().dropWhile(x -> x < 5).forEach(System.out::println);

输出:
5
2
3
6
7
8
9
10

  • ofNullable
Stream<String> stream = Stream.of("", null);
System.out.println(stream.count());

Stream<String> stream = Stream.of(null);
System.out.println(stream.count());//会抛空指针异常

Stream<String> stream = Stream.ofNullable(null);
System.out.println(stream.count());

输出:
2
0

  • iterate
//java8
Stream.iterate(1, i -> i + 1).limit(5).forEach(System.out::println);

//java9
Stream.iterate(1, i -> i < 6, i -> i + 1).forEach(System.out::println);

输出:
1
2
3
4
5

微信公众号:码上论剑 请关注我的个人技术微信公众号,订阅更多内容