我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,可是仍是有不少的特性值得关注。期待您能关注我,我将把java 9 写成一系列的文章,大概十篇左右,本文是第6篇。vue
本文带你们快速的了解一下在Java 9 种集合类Colleaction子类都发生了哪些比较有用的变化与加强。java
在Java 9中对Java Util Stream的语法进行了优化和加强,下面我就和你们一块儿看一下有哪些比较有价值的使用方法。spring
Stream.takeWhile(Predicate)
在进行Stream流的管道数据处理的时候,提供的Predicate条件返回false以后,将跳过剩余的数据元素直接返回。在下面的示例中,一旦Predicate条件!"orange" .equals(s)
返回false,则将跳过其余元素:后端
String[] fruits = {"apple", "banana", "orange", "mango", "peach"}; Stream<String> stream = Arrays.stream(fruits) .takeWhile(s -> !"orange".equals(s)); stream.forEach(System.out::println);
控制台输出结果为,依次对数组中元素过滤,到orange元素知足了!"orange" .equals(s)
=== false,流式处理再也不继续直接返回。数组
apple banana
须要注意的是:对于无序Stream,若是存在多个与提供的Predicate匹配的元素(多个orange),则此操做返回值是不肯定的。springboot
这种方法看上去和Java 8中的Stream.filter()很类似,可是它们的不一样之处在于filter()方法只是跳过了不匹配的元素,而后继续进行处理。然而takeWhile()方法在存在匹配项以后会跳过全部剩余的元素,有点像continue和break的区别。如下是具备相同流和Predicate的filter()方法示例:app
String[] fruits = {"apple", "banana", "orange", "mango", "peach"}; Stream<String> stream = Arrays.stream(fruits).filter(s -> !"orange".equals(s)); stream.forEach(System.out::println);
控制台输出以下,只是把orange过滤掉了。前后端分离
apple banana mango peach
Stream.dropWhile(Predicate)
提供的Predicate条件在管道流中返回false以后,此元素后面的全部数据元素做为返回值返回。微服务
String[] fruits = {"apple", "banana", "orange", "mango", "peach"}; Stream<String> stream = Arrays.stream(fruits) .dropWhile(s -> !"orange".equals(s)); stream.forEach(System.out::println);
在上面示例中,一旦Predicate条件!"orange".equals(s)
返回false,管道流中剩余的元素将被接受(不被过滤),做为返回值返回:优化
orange mango peach
Stream Stream.iterate(T,Predicate,UnaryOperator)
一旦Predicate条件返回false,此方法将返回一个顺序流,该顺序流将中止迭代操做。T为初始值,迭代操做由UnaryOperator来提供
Stream<String> iterate = Stream.iterate("-", s -> s.length() < 5, //Predicate条件 s -> s + "-"); //迭代操做 iterate.forEach(System.out::println);
控制台打印输出的结果,只输出四个横杠,到第五个的时候中止。这是由Predicate条件决定的。
- -- --- ----
Stream Stream.ofNullable(T)
此方法返回一个包含单个元素的顺序Stream。若是提供的元素为null,则此方法返回空Stream。当咱们要将非空单个元素附加到流时,此方法颇有用。例如:
String nullableItem = "peach"; Stream<String> stream = Stream.of("apple", "banana", "orange"); Stream<String> stream2 = Stream.concat(stream, Stream.ofNullable(nullableItem)); stream2.forEach(System.out::println);
控制台打印输出结果以下:
apple banana orange peach
IntStream,LongStream和DoubleStream方法
下面的这些XxxStream类也具备与Stream类等效的方法(ofNullable()方法除外)。
IntStream.of(2, 4, 6, 8, 9, 10, 11) .takeWhile(i -> i % 2 == 0) .forEach(System.out::println); //2,4,6,8
IntStream.of(2, 4, 6, 8, 9, 10, 11) .dropWhile(i -> i % 2 == 0) .forEach(System.out::println); // 9,10,11
IntStream.iterate(0, i -> i < 10, i -> i + 1) .forEach(System.out::print); // 0123456789
以为对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创做动力! 。另外,笔者最近一段时间输出了以下的精品内容,期待您的关注。