美文网首页
Guava - 强大的集合工具Lists

Guava - 强大的集合工具Lists

作者: 一点温柔 | 来源:发表于2019-11-03 01:18 被阅读0次

    一、简介

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

    二、实用的方法

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

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

    partition(List<T> list, int size)方法可以将指定的集合list通过一个指定分区大小size的参数,进行分区.返回List<List<T>>对象.

    实验代码:

            //测试partition()方法
            List<List<Integer>> 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<T> list)方法将返回指定集合的相反顺序集合.

    实验代码:

            //测试集合reverse()方法
            List<Integer> 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<TransformTestObject> transformTestObjectList = Lists.newArrayList(new TransformTestObject(1, "test1"), new TransformTestObject(2, "test2"), new TransformTestObject(3, "test3"));
            //将一个list转化为另外一个list
            List<String> nameList1 = Lists.transform(transformTestObjectList, TransformTestObject::getNameStr);
            //等同于 - 不过两者有质的区别
            List<String> 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<Character> 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<List<String>> 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<Integer> testListBase1 = Lists.newArrayList();
            //通过Base创建list
            List<Integer> testListBase = Lists.newArrayList(1, 2, null);
            //通过指定容量创建list
            List<Integer> testListWithCapacity = Lists.newArrayListWithCapacity(7);
            //通过Iterable创建list
            List<Integer> testListWithIterable = Lists.newArrayList(Iterables.concat());
            //通过Iterator创建list
            List<Integer> testListWithIterator = Lists.newArrayList(Iterators.concat());
            //通过Arrays创建list
            List<Integer> testListWithArray = Lists.newArrayList(ArrayUtils.EMPTY_INTEGER_OBJECT_ARRAY);
            //通过指定大小创建list
            List<Integer> testListWithExpectedSize = Lists.newArrayListWithExpectedSize(6);
    
    2、LinkedList相关静态工厂方法

    Lists除了对ArrayList的支持外,对LinkedList也是支持了部分静态工厂方法的,包含了basicIterable.

    实验代码:

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

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

    实验代码:

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

    ......未完待续

    相关文章

      网友评论

          本文标题:Guava - 强大的集合工具Lists

          本文链接:https://www.haomeiwen.com/subject/bpahbctx.html