一、简介
Guava
也提供了List
相关的较实用的工具类,除了让我们能在编码上更优雅之外,还伴有着防御式编程的特性,提供了许多非常实用的方法,如字符串转换为不可变的Character
集合、创建指定容量大小的集合等等.
二、实用的方法
Guava
的Lists
类中提供了许多实用的方法,可以帮助我们优雅的编码.
1、集合分区方法 - partition()
partition(List
方法可以将指定的集合list
通过一个指定分区大小size
的参数,进行分区.返回List
对象.>
实验代码:
//测试partition()方法
List> partitionList = Lists.partition(testList, 2);
System.out.println("===================测试partition()结果=================" + partitionList);
testList.remove(2);
System.out.println(testList);
System.out.println("===================测试partition()方法结果=================" + partitionList);
实验结果:
===================测试partition结果=================[[1, 2], [3, 4], [5]]
[1, 2, 4, 5]
===================测试partition()方法结果=================[[1, 2], [4, 5]]
可以发现partition()
方法确实按照期望值返回了.不过值得注意的是partition()
方法得到的结果并非是新创建的集合,集合中的元素是对原被分区集合的引用.被分区集合一发生变化则partition
的结果也跟着发生变化.
2、集合倒序方法 - reverse()
reverse(List
方法将返回指定集合的相反顺序集合.
实验代码:
//测试集合reverse()方法
List reverseList = Lists.reverse(testList);
System.out.println("==================测试reverse()方法结果=================" + reverseList);
testList.remove(2);
System.out.println(testList);
System.out.println("==================测试reverse()方法结果=================" + reverseList);
实验结果:
==================测试reverse()方法结果=================[5, 4, 3, 2, 1]
[1, 2, 4, 5]
==================测试reverse()方法结果=================[5, 4, 2, 1]
可以发现最终结果得到的是入参集合的反序集合,不过和partition()
方法一样,集合中的元素仅仅是对原有集合的引用.如果想要得到新的集合,可以使用Stream().map().collect()
的方式.
3、集合转换方法 - transform()
针对原有指定集合,Lists
提供了一个集合转换方法,它不会开辟出新的空间对转换后的数据进行存储,仅仅是改变了转换的方式,也特别的实用.
实验代码:
List transformTestObjectList = Lists.newArrayList(new TransformTestObject(1, "test1"), new TransformTestObject(2, "test2"), new TransformTestObject(3, "test3"));
//将一个list转化为另外一个list
List nameList1 = Lists.transform(transformTestObjectList, TransformTestObject::getNameStr);
//等同于 - 不过两者有质的区别
List nameList2 = transformTestObjectList.stream().map(TransformTestObject::getNameStr).collect(Collectors.toList());
System.out.println("============改变原有list前transform信息==============");
nameList1.forEach(System.out::println);
transformTestObjectList.forEach(transformTestObject -> {
transformTestObject.setNameStr("reset");
});
System.out.println("============改变原有list后transform信息==============");
nameList1.forEach(System.out::println);
System.out.println("============改变原有list后collect信息==============");
nameList2.forEach(System.out::println);
//实验表明,transform仅仅是做了一个引用转换的操作,nameList1集合中的值都是指向了原有的值,而nameList2搜集的结果是独立存在的.
public static class TransformTestObject {
private int code;
private String nameStr;
public TransformTestObject(int code, String nameStr) {
this.code = code;
this.nameStr = nameStr;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getNameStr() {
return nameStr;
}
public void setNameStr(String nameStr) {
this.nameStr = nameStr;
}
}
实验结果:
============改变原有list前transform信息==============
test1
test2
test3
============改变原有list后transform信息==============
reset
reset
reset
============改变原有list后collect信息==============
test1
test2
test3
4、字符串转换不可变character
集合方法 - charactersOf()
Guava
的Lists
类提供了便捷的字符串转character集合的方法.
实验代码:
List list = Lists.charactersOf("asdvasdfasdf");
System.out.println("==============测试charactersOf方法================" + list);
实验结果:
==============测试charactersOf方法================[a, s, d, v, a, s, d, f, a, s, d, f]
5、获取笛卡尔积方法 - cartesianProduct()
除了以上的方法外,Guava
还提供了求多个集合笛卡尔积的方法.
实验代码:
List> cartesianProductList = Lists.cartesianProduct(Lists.newArrayList("A", "B", "C"), Lists.newArrayList("a1", "b1", "c1"));
System.out.println("==============测试cartesianProductList方法()================" + cartesianProductList);
实验结果:
==============测试cartesianProductList方法()================[[A, a1], [A, b1], [A, c1], [B, a1], [B, b1], [B, c1], [C, a1], [C, b1], [C, c1]]
三、静态工厂方法
Guava
提供了许多LinkedList
和ArrayList
优雅创建集合的工厂方法,如通过Base
、指定容量
、指定大小
等方式创建.官网对其描述如下:
Implementation | Factories |
---|---|
ArrayList |
basic, with elements, from Iterable , with exact capacity, with expected size, from Iterator |
LinkedList |
basic, from Iterable |
1、ArrayList
相关静态工厂方法
Lists
为ArrayList
提供了多元化的静态工厂方法,支持的入参包含了basic
、数组
、Iterable
、指定集合容量
、指定集合大小
、Iterator
.
不过值得注意的是通过Lists创建的集合,入参时对象不能为NULL
,否则会被fail fast机制给处理掉
实验代码:
//=========================测试创建arrayList============================
//测试通过Base创建list
List testListBase1 = Lists.newArrayList();
//通过Base创建list
List testListBase = Lists.newArrayList(1, 2, null);
//通过指定容量创建list
List testListWithCapacity = Lists.newArrayListWithCapacity(7);
//通过Iterable创建list
List testListWithIterable = Lists.newArrayList(Iterables.concat());
//通过Iterator创建list
List testListWithIterator = Lists.newArrayList(Iterators.concat());
//通过Arrays创建list
List testListWithArray = Lists.newArrayList(ArrayUtils.EMPTY_INTEGER_OBJECT_ARRAY);
//通过指定大小创建list
List testListWithExpectedSize = Lists.newArrayListWithExpectedSize(6);
2、LinkedList
相关静态工厂方法
Lists
除了对ArrayList
的支持外,对LinkedList
也是支持了部分静态工厂方法的,包含了basic
和Iterable
.
实验代码:
//=========================测试创建LinkedList============================
//通过basic创建LinkedList
List testLinkedListBase = Lists.newLinkedList();
//通过Iterable创建LinkedList
List testLinkedListIterable = Lists.newLinkedList(Iterables.concat());
3、CopyOnWriteArrayList
相关静态工厂方法
除了常见的ArrayList
和LinkedList
之外,还支持了CopyOnWriteArrayList
.
实验代码:
//创建CopyOnWriteArrayList
List testCopyOnWriteArrayList = Lists.newCopyOnWriteArrayList();
//通过Iterable创建CopyOnWriteArrayList
List testCopyOnWriteArrayListIterable = Lists.newCopyOnWriteArrayList(Iterables.concat());
......未完待续