Guava - 强大的集合工具Lists

一、简介

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());

......未完待续

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,277评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,777评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,946评论 0 245
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,271评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,636评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,767评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,989评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,733评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,457评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,674评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,155评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,518评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,160评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,114评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,898评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,822评论 2 280
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,705评论 2 273

推荐阅读更多精彩内容