Java 使用Guava的收集器收集流向不可变的集合
Guava是谷歌的一套核心库,包括新的集合类型。例如,我们的multimap和multisets,不可变的集合,一个图库,以及用于并发的工具。它被许多公司所使用。在这篇文章中,我们将看到如何在Java中使用Guava的收集器来收集流到不可变的集合。要使用Guava,我们需要添加Maven依赖。否则,我们必须在我们的项目外部添加这个库。
说明:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
让我们在跳转到实现之前,为了清楚地理解,先回顾一下涉及方法的同样重要的概念。流的概念在这里起着重要的作用,在Java 8中已经被引入。一个流表示一个元素的序列,并支持不同类型的操作来对这些元素进行计算或批量操作。
- 流不是一个数据结构,而是从集合、阵列或I/O通道获取输入。
- 流不改变原来的数据结构,它们只是按照流水线的方法提供结果。
- 每个中间操作都被懒散地执行,并返回一个流作为结果,因此各种中间操作可以被流水线化。终端操作标志着流的结束并返回结果。
语法:
static IntStream range (int start, int end)
返回类型 :一个整数流
描述 :该方法用于返回整数流的顺序。
Stream intStream boxed()
返回类型 : Stream
描述 :该方法返回由该流的元素组成的流。
示例 1:
// Java Program to illustrate Use Guava's Collectors
// for Collecting Streams to Immutable Collections
// Importing utility classes from java.util package
// Importing guava Library
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
// Main class
public class App {
// Main driver method
public static void main(String[] args)
{
// Creating a stream of Integers from 0 to 9
// by using boxed method converting that stream
// into stream of elements
List<Integer> list
= IntStream.range(0, 9).boxed().collect(
ImmutableList.toImmutableList());
// printing the list
System.out.println(list);
}
}
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
注意: 在上面的输出中,我们打印了一个不可变的整数列表。如果我们试图修改这个列表,它将抛出一个UnsupportedOperationException。
示例 2:
// Java Program to illustrate Use Guava's Collectors
// for Collecting Streams to Immutable Collections
// Where UnsupportedOperationException is thrown
// Importing utility classes from java.util package
// Importing Guava library
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.IntStream;
// Main class
public class App {
// Main driver method
public static void main(String[] args)
{
// Creating a stream of Integers from 0 to 9
// by using boxed method converting that stream
// into stream of elements
List<Integer> list
= IntStream.range(0, 9).boxed().collect(
ImmutableList.toImmutableList());
// Adding more elements to immutatble list
// Note: Trying to add
list.add(12);
list.add(13);
list.add(14);
// Print and display the List
System.out.println(list);
}
}
输出:
Exception in thread "main" java.lang.UnsupportedOperationException
at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:220)
at james.App.main(App.java:15)