如何在Java 8中把流转换为ArrayList - Collectors.toCollection()示例

383 阅读4分钟

你可以使用 Collectors.toList()toSet()和toMap() 来获取流的所有元素到任何集合中,如List、Set或Map,但如果你想获取一个特定的集合,如ArrayList,那么你需要使用Collectors.toCollection(ArrayList::new)方法。这个方法首先使用方法引用创建一个ArrayList,然后将Stream的所有元素添加到ArrayList中。如果你有一个很长的字符串列表,而你想创建一个较小的列表,只包含以字母 "b "开头的字符串,如"Bluehost",那么这个方法非常有用。

你需要做的是首先通过调用stream()方法从List中获得流,然后调用filter()方法创建一个新的过滤值流,最后调用Collectors.toCollection(ArrayList::new) 来收集这些元素到一个ArrayList中。

java.util.stream.Collectors类还允许你进行有用的减少操作,比如将流元素累积到集合中,如list、set或map。

它提供了方便的实用方法,如toList() 从Stream中获取元素列表,toSet()从Stream中获取Set内的元素,toMap()从Stream中存储的对象创建Map。

如果你不想收集而只想打印,你也可以在Java 8中使用forEach()方法来打印Stream的所有元素。在这篇文章中,你会看到几个例子来更好地理解这个概念。

但是当你使用toList()方法时,并不能保证返回的List的类型、可变性、可序列化或线程安全,这就是为什么如果你需要一个ArrayList,你应该使用toCollection()方法。

你也可以看看Udemy上的The Complete Java MasterClass课程,了解更多关于在Java 8中有效使用收集器的知识。这也是学习Java的最新课程,最近还更新了,涵盖了最新的Java版本,即Java 11。

Java 8中从流获取ArrayList的Java程序

下面是我们的示例Java程序,演示如何在Java中从流中获取ArrayList。它展示了你如何使用收集器来收集各种集合的结果。

Btw,你可以使用Java的静态导入功能来使代码更易读,只需静态导入Collectors方法,而不是写Collectors.collect(),只需写collect()或Collectors.toList(),只需写toList()。

这将使你的代码更简洁,更易读。

How to convert Stream to ArrayList in Java 8 - Collector example

记住,当你调用toList()、toSet()或toMap()方法时,不保证会返回哪个实现。如果你想要一个特定的集合类型,那么只需要求它,就像我们在这里要求ArrayList一样。

同样地,如果你要将Stream转换为Map,如果你想保留顺序,你可以要求LinkedHashMap。如果你有兴趣深入学习Stream API,你还可以查看Pluralsight上的From Collections to Streams in Java 8 Using Lambda Expressions课程,这是深入学习Stream的最佳课程之一。

在Java 8中从流转到数组列表

import

这就是关于如何在Java 8中从Stream中获得ArrayList 或如何在Java中把Stream转换为ArrayList的全部内容。 正如你所看到的,这很简单,所需要做的就是使用Collectors类和它的toCollection()方法。

这个方法接受一个Supplier,一个功能接口,返回一个新的、适当类型的空集合。你也可以使用Collectors类中的toList()、toSet()和toMap()方法,在Java中把Stream转换为List、Set或Map。

请记住,ArrayList只有在Stream不是并行的情况下才会保留顺序。对于并行的Stream,ArrayList可能有不同顺序的元素,因为它们被添加了。

相关的Java 8教程
如果你有兴趣了解更多关于Java 8的新功能,这里有我早期的文章,涵盖了Java 8的一些重要概念。

  • 学习Java 8和Java 9的5个免费课程(课程)

  • 5本从零开始学习Java 8的书籍(书籍)

  • Java 8中可选的10个例子?(例子)

  • 如何在Java 8中连接字符串(例子)

  • 在Java 8中如何按数值排序? (例子)

  • 如何在Java 8中用LocalDateTime格式化/解析日期?(教程)

  • 如何在Java 8中使用peek()方法(举例)?

  • 在Java 8中如何将List转换为Map(解决方案)

  • Java 8中日期和时间的20个例子(教程)

  • 在Java 8中如何按键对地图进行排序(例子)?

  • 如何在Java 8中使用Stream类(教程)

  • 如何在Java 8中使用filter()方法(教程)

  • Java 8中的抽象类和接口的区别?(答案)

  • 掌握Java 8概念的五大在线课程(课程)

感谢你到目前为止阅读这篇文章。如果您喜欢这篇文章,请与您的朋友和同事分享。如果您有任何问题或反馈,请发表评论。

P.S. - 如果您只是想了解更多关于Java 8的新功能,那么请您看看 Java编程、Lambda等(Java 13、12、11、10、9、8),这是Udemy上的一个免费课程**。**它解释了Java 8的所有重要特性,如lambda表达式、流、功能接口、Optional、新的日期时间API和其他杂项变化。