Lists类主要提供了对List类的子类构造以及操作的静态方法。在Lists类中支持构造ArrayList、LinkedList以及newCopyOnWriteArrayList对象的方法。
其中提供了以下构造ArrayList的函数:下面四个构造一个ArrayList对象,但是不显式的给出申请空间的大小:
newArrayList() newArrayList(E... elements) newArrayList(Iterable<? extends E> elements) newArrayList(Iterator<? extends E> elements)
以下两个函数在构造ArrayList对象的时候给出了需要分配空间的大小:
newArrayListWithCapacity(int initialArraySize) newArrayListWithExpectedSize(int estimatedSize)
如果你事先知道元素的个数,可以用newArrayListWithCapacity函数;如果你不能确定元素的个数,可以用newArrayListWithExpectedSize函数,在newArrayListWithExpectedSize函数里面调用了computeArrayListCapacity(int arraySize)函数,其实现如下:
@VisibleForTesting static int computeArrayListCapacity(int arraySize) { checkArgument(arraySize >= 0); // TODO(kevinb): Figure out the right behavior, and document it return Ints.saturatedCast(5L + arraySize + (arraySize / 10)); }
返回的容量大小为5L + arraySize + (arraySize / 10),当arraySize比较大的时候,给定大小和真正分配的容量之比为10/11。
Lists类还支持构造LinkedList、newCopyOnWriteArrayList对象,其函数接口为:
newLinkedList() newLinkedList(Iterable<? extends E> elements) newCopyOnWriteArrayList() newCopyOnWriteArrayList(Iterable<? extends E> elements)
我们还可以将两个(或三个)类型相同的数据存放在一个list中,这样可以传入到只有一个参数的函数或者需要减少参数的函数中,这些函数如下:
asList(@Nullable E first, E[] rest) asList(@Nullable E first, @Nullable E second, E[] rest)
Lists类中transform函数可以根据传进来的function对fromList进行相应的处理,并将处理得到的结果存入到新的list对象中,这样有利于我们进行分析,函数接口如下:
public static <F, T> List<T> transform( List<F> fromList, Function<? super F, ? extends T> function)
使用例子:
Function<String, Integer> strlen = new Function<String, Integer>() { public Integer apply(String from) { Preconditions.checkNotNull(from); return from.length(); } }; List<String> from = Lists.newArrayList("abc", "defg", "hijkl"); List<Integer> to = Lists.transform(from, strlen); for (int i = 0; i < from.size(); i++) { System.out.printf("%s has length %d\n", from.get(i), to.get(i)); } Function<String, Boolean> isPalindrome = new Function<String, Boolean>() { public Boolean apply(String from) { Preconditions.checkNotNull(from); return new StringBuilder(from).reverse().toString().equals(from); } }; from = Lists.newArrayList("rotor", "radar", "hannah", "level", "botox"); List<Boolean> to1 = Lists.transform(from, isPalindrome); for (int i = 0; i < from.size(); i++) { System.out.printf("%s is%sa palindrome\n", from.get(i), to1.get(i) ? " " : " NOT "); } // changes in the "from" list are reflected in the "to" list System.out.printf("\nnow replace hannah with megan...\n\n"); from.set(2, "megan"); for (int i = 0; i < from.size(); i++) { System.out.printf("%s is%sa palindrome\n", from.get(i), to1.get(i) ? " " : " NOT "); }
Lists还可以将传进来的String或者CharSequence分割为单个的字符,并存入到一个新的List对象中返回,如下:
ImmutableList<Character> wyp = Lists.charactersOf("wyp"); System.out.println(wyp);
将List对象里面的数据顺序反转可以用reverse函数实现,取得List对象里面的子序列可以用subList函数实现。更多的实现可以参看其源码。
相关推荐
除了以上提到的功能,Guava Collections 还包含许多其他实用工具,如 Predicates、Functions 和 Lists 等,帮助开发者写出更简洁、更可读的代码。这些经过精心设计和充分测试的 API,大大提升了开发效率,减少了潜在...
虽然Java 8引入了流API,但Guava早在其之前就提供了类似的功能,如`FluentIterable`,它允许链式操作并提供了便利的转换和过滤方法。 7. **其他功能**: - **检查类(CheckArgument, CheckNotNull等)**: 提供了...
1. **集合框架增强**:Guava 提供了丰富的集合类,如 Multiset(多集合)、Multimap(多映射)、Immutable collections(不可变集合)等,这些集合在功能和性能上都优于 Java 标准库中的集合。 2. **缓存**:Guava ...
List<Integer> lengths = Lists.transform(Arrays.asList("abc", "def"), lengthExtractor); ``` 以上只是 Guava 30.1.1 版本中的一部分核心功能,实际使用中还有许多其他实用工具类,如 `Range`, `EventBus`, `...
Guava早在Java 8的Stream API之前就引入了FluentIterable,它提供了类似Stream的功能,可以方便地对集合进行链式操作。例如: ```java FluentIterable<String> iterable = FluentIterable.from(Arrays.asList("a...
List<String> stringList = Collections2.transform(strings, new Function, String>() { @Override public String apply(Integer input) { return input.toString(); } }); ``` 在Java 8之后,我们可以使用...
这里我们将深入探讨 Guava 与 Java 8 Stream API 在功能、用法以及性能上的差异。 1. **Java 8 Stream API** Java 8 引入了 Stream API,它为处理集合提供了声明式编程风格,允许我们以流畅、链式的方式处理数据。...
Guava的ImmutableCollections(不可变集合)是线程安全且不可修改的,适用于创建常量或配置类。 其次,Guava的缓存功能允许开发者轻松地在应用程序中实现本地缓存策略,提高性能并减少对远程服务的调用。...
- **Immutable Collections**:不可变的集合类,确保一旦创建就不能被修改,提供线程安全。 - **BiMap**:双向映射,允许在键和值之间进行双向查找。 - **Table**:二维表格数据结构,用于存储键-键对的数据。 2...
10. **流(Stream)的替代方案**:虽然Java 8引入了Stream API,但Guava的Iterables和Collections提供了类似的功能,如transform()、filter()和partition(),在不支持Java 8的环境中也能实现类似流的操作。 在实际...
Google Collections(Guava)库不仅限于`Maps`模块,还包括`Lists`、`Sets`、`Multisets`、`Iterators`等多个子模块,它们都提供了丰富的功能和优化,使得Java编程更加简洁和高效。在实际开发中,熟练掌握并运用这些...
总之,Google Collections(现在的 Guava)为 Java 开发者提供了大量实用工具和集合扩展,提高了代码的可读性、效率和安全性。无论是进行简单的数据操作还是设计复杂的系统,这个库都是一把不可或缺的利器。
Guava的`Lists.partition()`方法允许我们将一个大列表分割成多个小列表,每个小列表的大小可以指定。这对于批量处理大列表,或者在多线程环境中并行处理数据非常有帮助。例如,如果我们有一个包含100个元素的列表,...
首先,Google Collections库,现已被更名为Guava,是Google提供的一套强大的Java工具类库。它包含了大量对Java集合框架的扩展,如Multiset、Multimap、ImmutableList等,还有许多实用的函数式编程工具,如Predicates...
List<String> unmodifiableList = Lists.newArrayList(Collections.unmodifiableList(originalList)); ``` 除了`newArrayList`,`com.google.common.collect`包还提供了许多其他强大的工具,如`ImmutableList`、`...
- **Collections2**、**Lists**、**Sets**等工具类:提供了许多便利的静态方法,如排序、转换、过滤等。 4. **学习与实践** 学习Google Collections 1.0,开发者可以深入理解如何利用这些高级数据结构和工具来...
Guava的Iterables、Lists和Collections2等类提供了丰富的操作序列的方法,如filter、transform和apply等。 7. **事件监听** Guava的EventBus是一种简单的发布-订阅事件总线,可以方便地实现组件间的松耦合通信。 ...
这个"google-collections-1.0.jar"文件就是谷歌Common库的一个早期版本,它在2007年首次发布,是Google Collections Library的前身,后来演变为Guava库。 在"google-collections-1.0.jar"中,我们可以找到许多关键...
它们在很多场景下能够替代Java标准库中的`Collections.unmodifiable*`方法,提供更强的类型安全性和性能。 使用不可变集合有以下好处: - **线程安全**:不可变对象天生就是线程安全的,可以减少在多线程环境中的...
guava-collect-base:收集的基类(Collections2,Lists,Iterables ...)-大小约75Kb请注意,与不可变相关的类将出现在另一个包中 ...更多 执照 Copyright 2015 Romain Piel Licensed under the Apache License, ...