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项目中找到。