将Java中的Iterable转为Collection
在Java编程中,我们常常需要处理集合类数据,而Java集合类库中的两个常见接口Iterable
和Collection
,是我们常用到的。虽然它们都可以遍历集合元素,但它们又有所不同。其中Iterable
表示一类可以遍历的元素,而Collection
表示实际包含有元素的集合。
我们可能在开发中需要将Iterable
类型的对象转换为Collection
类型的对象,以便进一步进行操作和处理。比如,我们需要从文件中读取一些数据,此时拿到的往往是Iterator类型的集合,如果直接将它传递给只接受Collection类型的方法,则编译器会提示错误,需要进行类型转换。
接下来就让我们一起来了解如何将Iterable
类型转换为Collection
类型吧。
示例代码
我们首先来看下面的Java语言代码示例,它展示了将Iterable类型转换为Collection类型的实现方式。
Iterable<String> itr = new ArrayList<>();
itr.forEach(System.out::println);
Collection<String> col = new ArrayList<>();
itr.forEach(col::add);
以上代码,首先我们创建了一个Iterable<String>
类型的数组列表对象itr
,然后使用forEach()
方法遍历输出其中的元素。接着创建了一个Collection<String>
类型的数组列表对象col
,通过迭代器中的每个元素调用add
方法,将其中的元素添加到col
中去。最终我们得到了一个类型为Collection
的对象col
,它可以进行类似集合操作的其他操作。
在以上示例代码中,我们使用了forEach
方法遍历两个集合中的元素,这种方法是基于Iterator实现的。所以,通过调用其内部的next()
方法来遍历整个Iterable集合。
需要注意的是,尽管可以使用forEach
等方法对Iterable
集合进行遍历,实际上Iterable
是没有add
等修改元素的方法。因此,我们需要先创建一个Collection
类型对象,然后再将其添加到该对象中。
接下来,我们来了解一些其他实现方式。
实现方式
方式一:遍历添加
我们已经在前面的示例代码中看到了,将Iterable类型转换为Collection类型的最常见方式就是遍历,然后将元素一个个加入到Collection中。
具体的实现代码如下:
Iterable<String> itr = new ArrayList<>();
Collection<String> col = new ArrayList<>();
for (String s : itr) {
col.add(s);
}
以上代码,我们创建了一个Iterable
的列表,然后创建了一个ArrayList
类型的Collection
对象col
,然后定义一个foreach
循环,不断从Iterable
中取出元素并添加到Collection
中去。最终得到的col
对象就是我们需要的Collection
类型对象。
需要注意的是,这种方式虽然简单易用,但是会引起不必要的性能浪费,当元素非常多时,性能会大大降低。
方式二:使用Java 8中的stream
Java 8中的Stream
已经成为了Java中的重要特性之一,其中的一些方法可以用来操作集合类型数据。
我们可以通过将Iterable
转换为Stream
,然后使用strem
中的对应方法将其转换为Collection
类型。具体的实现代码如下:
Iterable<String> itr = new ArrayList<>();
Collection<String> col = StreamSupport.stream(itr.spliterator(), false).collect(Collectors.toList());
在这个示例代码中,我们首先使用了spliterator()
方法将 Iterable
转换为 Spliterator
,然后再通过 StreamSupport.stream()
将其转换为 stream()
。 最后通过collect(Collectors.toList())
方法将流中的元素收集到一个List
中去,该List
即为我们需要的Collection
类型。
需要注意的是,在将Iterable
转换为Stream
时,需要使用Spliterator
,它是流式编程中的一个重要概念,代表一个可以被分迭代的元素序列。
方式三:使用Apache Commons Collections
在Apache Commons Collections库中,提供了一种快速将Iterable
转换为Collection
类型的方式。具体的实现代码如下:
Iterable<String> itr = new ArrayList<>();
Collection<String> col = org.apache.commons.collections4.IterableUtils.toList(itr);
以上代码中,我们使用Apache Commons Collections库中的IterableUtils.toList()
方法,将Iterable
对象转换为Collection
对象。
需要注意的是,该库对Java 8提供了很好的支持,还有很多其他实用的方法,可以在实际开发中发挥作用。
结论
在Java编程中,常常需要处理集合类型的数据,将Iterable
类型转换为Collection
类型是一个常见需求。本文介绍了三种实现方式,包括遍历添加、使用Java 8中的Stream以及使用Apache Commons Collections库。不同的方法适用于不同的场景,具体的选择需要根据实际的需要和性能要求进行考量。