java附加属性_Java 9附加流

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操作将返回最长的前缀 ,该前缀仅包含通过谓词的元素。

前缀可以为空,因此如果第一个元素使谓词失败,它将返回空流。 相反,前缀可以是整个流,如果所有元素都通过谓词,则操作将返回该前缀。

订购

谈论前缀仅对有序流有意义。 那么对于无序的人会发生什么呢? 与流一样,故意不指定行为以启用高性能实现。

从无序流中获取将返回那些通过谓词的元素的任意子集。 除非它们全部都执行,否则它将始终返回整个流。

并发

从有序并行流中获取并不是最好的主意。 不同的线程必须配合以确保返回最长的前缀。 这种开销可能会降低性能,以至于使流顺序变得更有意义。

Java-9流

发布时间安迪·亚瑟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附加属性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值