Guava - 强大的集合工具Lists

一、简介

Guava也提供了List相关的较实用的工具类,除了让我们能在编码上更优雅之外,还伴有着防御式编程的特性,提供了许多非常实用的方法,如字符串转换为不可变的Character集合、创建指定容量大小的集合等等.

二、实用的方法

GuavaLists类中提供了许多实用的方法,可以帮助我们优雅的编码.

1、集合分区方法 - partition()

partition(List list, int size)方法可以将指定的集合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 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()

GuavaLists类提供了便捷的字符串转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提供了许多LinkedListArrayList优雅创建集合的工厂方法,如通过Base指定容量指定大小等方式创建.官网对其描述如下:

Implementation Factories
ArrayList basic, with elements, from Iterable, with exact capacity, with expected size, from Iterator
LinkedList basic, from Iterable
1、ArrayList相关静态工厂方法

ListsArrayList提供了多元化的静态工厂方法,支持的入参包含了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也是支持了部分静态工厂方法的,包含了basicIterable.

实验代码:

        //=========================测试创建LinkedList============================
        //通过basic创建LinkedList
        List testLinkedListBase = Lists.newLinkedList();
        //通过Iterable创建LinkedList
        List testLinkedListIterable = Lists.newLinkedList(Iterables.concat());
3、CopyOnWriteArrayList相关静态工厂方法

除了常见的ArrayListLinkedList之外,还支持了CopyOnWriteArrayList.

实验代码:

        //创建CopyOnWriteArrayList
        List testCopyOnWriteArrayList = Lists.newCopyOnWriteArrayList();
        //通过Iterable创建CopyOnWriteArrayList
        List testCopyOnWriteArrayListIterable = Lists.newCopyOnWriteArrayList(Iterables.concat());

......未完待续

你可能感兴趣的:(Guava - 强大的集合工具Lists)