java附加属性
Java 9即将发布! 它不仅仅是Jigsaw项目 。 (我也很惊讶。)它给平台带来了很多小的变化,我想一一看一下。 我将标记所有这些帖子,您可以在这里找到它们。
让我们从…开始
流
Streams学习了两个新技巧。 第一个处理前缀,流现在可以理解前缀。 我们可以使用谓词来测试流的元素,从一开始就可以使用或删除它们,直到第一个未通过测试为止。
Stream :: takeWhile
让我们先来看一下take:
Stream<T> takeWhile(Predicate<? super T> predicate);
在有序流上调用它会返回一个新的流,该流包含通过谓词的元素, 直到第一个失败 。 它有点像过滤器,但是一旦第一个元素失败了谓词,它就会切断流。 用它的话来说,它从流中获取元素,而谓词在不再存在时就保持并停止。
让我们来看一个例子:
Stream.of("a", "b", "c", "", "e").takeWhile(s -> !String.isEmpty(s));.forEach(System.out::print);Console: abc
容易吧? 请注意,即使e通过了谓词,e也不是返回流的一部分。 但是,它从未经过测试,因为takeWhile是在空字符串之后完成的。
前缀
为了确保我们了解文档 ,让我们了解术语。 从流的第一个元素开始的有序流的子序列称为prefix 。
Stream<String> stream = Stream.of("a", "b", "c", "d", "e");
Stream<String> prefix = Stream.of("a", "b", "c");
Stream<String> subsequenceButNoPrefix = Stream.of("b", "c", "d");
Stream<String> subsetButNoPrefix = Stream.of("a", "c", "b");
takeWhile操作将返回最长的前缀 ,该前缀仅包含通过谓词的元素。
前缀可以为空,因此如果第一个元素使谓词失败,它将返回空流。 相反,前缀可以是整个流,如果所有元素都通过谓词,则操作将返回该前缀。
订购
谈论前缀仅对有序流有意义。 那么对于无序的人会发生什么呢? 与流一样,故意不指定行为以启用高性能实现。
从无序流中获取将返回那些通过谓词的元素的任意子集。 除非它们全部都执行,否则它将始终返回整个流。
并发
从有序并行流中获取并不是最好的主意。 不同的线程必须配合以确保返回最长的前缀。 这种开销可能会降低性能,以至于使流顺序变得更有意义。
发布时间由安迪·亚瑟在CC-BY 2.0 。
流:: drop
接下来是dropWhile:
Stream<T> dropWhile(Predicate<? super T> predicate);
它与takeFirst恰好相反:在有序流上调用它将返回一个新的元素,该元素包含使谓词失败的第一个元素和所有后续的元素。 或者,更接近其名称,它在谓词成立的同时丢弃元素并返回其余的元素。
时间为例:
Stream.of("a", "b", "c", "de", "f").dropWhile(s -> s.length <= 1);.forEach(System.out::print);Console: def
请注意,即使它不通过谓词,流也包含f。 与之前类似,操作在第一个字符串使谓词失败(在这种情况下为ef)之后停止。
在无序流上调用该操作将删除那些无法通过谓词的元素的子集。 除非所有人都这样做,否则它将始终返回空流。 我们上面所说的有关术语和并发性的所有其他内容也适用于此。
流:: ofNullable
那真的很琐碎。 与其讨论,不如让它实际运行:
long one = Stream.ofNullable("42").count();
long zero = Stream.ofNullable(null).count();
你答对了? 除非它为null,否则它将使用给定的元素创建一个流,在这种情况下,该流为空。 打哈欠!
不过,它有其用例。 以前,如果某个邪恶的API给您提供了一个可能为null的实例,则开始在该实例可以提供的流上开始操作是circuit回的:
// findCustomer can return null
Customer customer = findCustomer(customerId);Stream<Order> orders = customer == null? Stream.empty(): customer.streamOrders();
// do something with stream of orders ...// alternatively, for the Optional lovers
Optional.ofNullable(customer).map(Customer::streamOrders).orElse(Stream.empty(). // do something with stream of orders
现在情况变得更好了:
// findCustomer can return null
Customer customer = findCustomer(customerId);Stream.ofNullable(customer).flatMap(Customer::streamOrders). // do something with stream of orders
反射
我们已经看到了takeWhile如何返回通过谓词的元素,并在第一个元素失败时将流切断。 相反,当第一个元素未通过谓词时,dropWhile也会剪切流,但在其后将返回该谓词。
作为一个告别,让我们看一个最后的示例,在该示例中,我们从HTML文件的meta元素流式传输所有行:
Files.lines(htmlFile).dropWhile(line -> !line.contains("<meta>").skip(1).takeWhile(line -> !line.contains("</meta>")
我们还了解了ofNullable。 我不知道为什么看起来如此熟悉? 是的,当然是可选的! 巧合的是,我接下来会介绍。 :)
敬请关注!
翻译自: https://www.javacodegeeks.com/2016/06/java-9-additions-stream.html
java附加属性