1. 概述
在这个简短的教程中,我们将学习如何将一个Java Iterable对象转换为Stream,并在其上执行一些标准操作。
2. 将Iterable转换为Stream
Iterable
接口设计时考虑了通用性,它本身并不提供stream()
方法。
简单来说,你可以将Iterable
实例传递给StreamSupport.stream()
方法,从而从给定的Iterable
实例中获取一个Stream
。
假设我们有一个Iterable
实例:
Iterable<String> iterable
= Arrays.asList("Testing", "Iterable", "conversion", "to", "Stream");
以下是将其转换为Stream
的方法:
StreamSupport.stream(iterable.spliterator(), false);
请注意,StreamSupport.stream()
方法的第二个参数决定了生成的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));
}
顺便提一下,Stream
不可重用,而Iterable
可以;它还提供了spliterator()
方法,该方法返回一个java.lang.Spliterator
实例,用于遍历由给定Iterable
描述的元素。
3. 执行Stream
操作
让我们执行一个简单的Stream
操作:
@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"));
}
4. 总结
这个简单的教程展示了如何将Iterable
实例转换为Stream
实例,并在其上执行与处理其他任何Collection
实例相同的操作。
所有代码片段的实现可以在GitHub项目中找到。