java8 转换Iterable 至 Stream
本文简要介绍在java8中转换java Iterable对象至Stream,利用Stream执行标准操作。
1.转换Iterable 至 Stream
Iterable接口设计的目的是保持通用性,不提供任何stream方法。简单来说,你可以通过StreamSupport.stream() 方法从it实例中获取stream。
下面看一个Iterable实例:
Iterable<String> iterable
= Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");
转换为stream的代码:
StreamSupport.stream(iterable.spliterator(), false);
注意,StreamSupport.stream() 方法第二个参数决定返回结果stream是否为并行。true为并行,否则为串行。
测试代码:
@Test
public void givenIterable_whenConvertedToStream_thenNotNull() {
Iterable<String> iterable
= Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");
Assert.assertNotNull(StreamSupport.stream(iterable.spliterator(), false));
}
需要了解:流不能重用,但Iterable可以,同时提供了spliterator()方法,其返回java.lang.Spliterator 实例。
2.执行流操作
请看示例代码:
@Test
public void whenConvertedToList_thenCorrect() {
Iterable<String> iterable
= Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");
List<String> result = StreamSupport.stream(iterable.spliterator(), false)
.map(String::toUpperCase)
.collect(Collectors.toList());
assertThat(
result, contains("TESTING", "ITERABLE", "CONVERSION", "TO", "STREAM"));
}
3.总结
本文简短地展示了如何利用java8 StreamSupport.stream() 方法转换Iterable实例至stream实例,然后利用stream执行标准操作,如在其他任何Collection实例上操作的一样。