java8 转换Iterable 至 Stream

本文介绍如何在Java8中将Iterable对象转换为Stream,并利用Stream进行标准操作,例如转换所有字符串为大写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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实例上操作的一样。

### Java 11 中将 Iterable 转换为 List 的方法 在 Java 11 中,可以采用多种方式来实现 `Iterable` 到 `List` 的转换。以下是几种常见且有效的方式: #### 使用 Stream API 和 Collectors.toList() 现代 Java 版本推荐使用流(Stream)API 来处理集合操作。通过调用 `stream()` 方法并结合 `Collectors.toList()`, 可以轻松完成此转换。 ```java import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { Iterable<String> iterable = Arrays.asList("a", "b", "c"); List<String> list = stream(iterable).collect(Collectors.toList()); System.out.println(list); } private static <T> Stream<T> stream(Iterable<T> iterable){ return StreamSupport.stream(((Iterable<T>) iterable).spliterator(), false); } } ``` 这种方法不仅简洁明了,而且充分利用了 Java 流的强大功能[^4]。 #### 使用 ArrayList 构造函数 另一种简单直接的方法是利用 `ArrayList` 提供的构造器,该构造器接受一个 `Collection` 参数。虽然这看起来像是针对 Collection 类型的操作,但实际上可以通过先将其转成 Collection 或者借助中间容器达成目的。 ```java import java.util.*; public class Main { public static void main(String[] args) { Iterable<String> iterable = () -> Collections.singletonList("singleItem").iterator(); List<String> list = new ArrayList<>(toList(iterable)); System.out.println(list); List<String> directConversion = new ArrayList<>(); iterable.forEach(directConversion::add); System.out.println(directConversion); } private static <E> List<E> toList(Iterable<? extends E> elements) { List<E> result = new ArrayList<>(); for (E element : elements) { result.add(element); } return result; } } ``` 这种方式适用于不想引入额外依赖的情况,并保持良好的性能表现[^2]。 #### 避免不安全的强制类型转换 值得注意的是,在某些情况下可能会有人尝试直接进行强转(`cast`),但这通常不是最佳实践,因为如果源对象并非实际实现了目标接口,则会抛出运行时异常。因此建议优先考虑上述两种更为稳健的做法而不是简单的类型转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值