前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Guava Collect API

Guava Collect API

原创
作者头像
HLee
修改于 2021-09-09 09:28:09
修改于 2021-09-09 09:28:09
1.1K00
代码可运行
举报
文章被收录于专栏:房东的猫房东的猫
运行总次数:0
代码可运行

简介

Guava[ˈɡwɑːvə] 是 Google 开源的一个 Java 工具库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
	<groupId>com.google.guava</groupId>
	<artifactId>guava</artifactId>
	<version>29.0-jre</version>
</dependency>

Lists

Guava 的 Lists 类全路径:com.google.common.collect.Lists

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.collect.Lists;

List list = Lists.newArrayList();
List list = Lists.newLinkedList();

备注:
Lists.newArrayList()new ArrayList()是一样的,没有区别

描述:将其他 Collection 类型的集合转换成 ArrayList

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ListsTest {

    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("a");
        set.add("b");
        set.add("c");
        List<String> list = Lists.newArrayList(set);
    }
}

Lists.reverse

描述:使用 reverse方法翻转 List

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ListsTest {

    public static void main(String[] args) {

        List<String> originList = Lists.newArrayList("1", "2");
        List<String> reversedList = Lists.reverse(originList);

        System.out.println("原List: " + originList);
        System.out.println("翻转后:  " + reversedList);
    }
}

执行结果:
原List: [1, 2]
翻转后:  [2, 1]

Lists.charactersOf

描述:将字符串拆分为字符组成的列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ListsTest {

    public static void main(String[] args) {

        List<Character> list = Lists.charactersOf("Hello");
        System.out.println(list);
    }
}

执行结果:
[H, e, l, l, o]

Lists.partition

描述:使用partition方法,会将一个 List 拆分为多个List,每个 List (最大)大小为指定大小。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ListsTest {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        // 按大小 2 拆分
        List<List<Integer>> listPartitionList = Lists.partition(list, 2);

        System.out.println("原 List:");
        System.out.println(list);

        System.out.println("拆分后:");
        for (List<Integer> partition: listPartitionList) {
            System.out.println(partition);
        }
    }
}

执行结果:
原 List:
[1, 2, 3, 4, 5]
拆分后:
[1, 2]
[3, 4]
[5]

Lists.cartesianProduct

描述:计算多个List的笛卡尔乘积

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ListsTest {

    public static void main(String[] args) {

        List<List<String>> result = Lists.cartesianProduct(
                Lists.newArrayList("1", "2"),
                Lists.newArrayList("a", "b", "c")
        );
        for (List<String> item : result) {
            System.out.println(item);
        }
    }
}

执行结果:
[1, a]
[1, b]
[1, c]
[2, a]
[2, b]
[2, c]
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ListsTest {

    public static void main(String[] args) {

        List<List<String>> result = Lists.cartesianProduct(
                Lists.newArrayList("1", "2"),
                Lists.newArrayList("a", "b", "c"),
                Lists.newArrayList("mmm", "nnn")
        );
        for (List<String> item : result) {
            System.out.println(item);
        }
    }
}

结果:
[1, a, mmm]
[1, a, nnn]
[1, b, mmm]
[1, b, nnn]
[1, c, mmm]
[1, c, nnn]
[2, a, mmm]
[2, a, nnn]
[2, b, mmm]
[2, b, nnn]
[2, c, mmm]
[2, c, nnn]

Lists.transform

描述:使用 Lists.transform处理每个List元素并生成新List

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import org.checkerframework.checker.nullness.qual.Nullable;

import java.util.List;

public class ListsTest {

    public static void main(String[] args) {
        List<Integer> list = Lists.newArrayList(1, 2, 3);
        List<String> result = Lists.transform(list, new Function<Integer, String>() {
            @Override
            public String apply(@Nullable Integer input) {
                return "Hello " + input;
            }
        });
        System.out.println("list: " + list);
        System.out.println("result: " + result);
    }
}

结果:
list: [1, 2, 3]
result: [Hello 1, Hello 2, Hello 3]

如果使用的是 Java 8 或以上版本,可以使用自带的 Stream :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.collect.Lists;

import java.util.List;
import java.util.stream.Collectors;

public class ListsTest {

    public static void main(String[] args) {
        List<Integer> list = Lists.newArrayList(1, 2, 3);
        List<String> result = list.stream().map(item -> "Hello " + item).collect(Collectors.toList());
        System.out.println("list: " + list);
        System.out.println("result: " + result);
    }
}

ImmutableList

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[ɪˈmjuːtəbl]
adj. 不变的;不可变的;不能变的

Guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现。Guava提供了对JDK里标准集合类里的immutable版本的简单方便的实现,以及Guava自己的一些专门集合类的immutable实现。当你不希望修改一个集合类,或者想做一个常量集合类的时候,使用immutable集合类就是一个最佳的编程实践。 

注意:每个Guava immutable集合类的实现都拒绝null值。

Java中的Immutable对象:简单地说,如果一个对象实例不能被更改就是一个Immutable的对象,Java SDK提供的大量值对象,比如String等都是Immutable的对象。

ImmutableList是一个不可变、线程安全的列表集合,它只会获取传入对象的一个副本,而不会影响到原来的变量或者对象,如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.collect.ImmutableList;

public class ImmutableTest {

    public static void main(String[] args) {

        int a = 23;
        ImmutableList<Integer> list = ImmutableList.of(a, 12);
        System.out.println("ImmutableList:" + list);
        a = 232;
        System.out.println("ImmutableList:" + list);
    }
}

输出:
ImmutableList:[23, 12]
ImmutableList:[23, 12]

初始化ImmutableList

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;

import java.util.List;

public class ImmutableTest {

    public static void main(String[] args) {

        /**
         * 第一种:Builder
         */
        List<String> CONSTANT_LIST = new ImmutableList.Builder<String>()
            .add("网页打不开或提示内容已删除、无法找到该网页")
            .add("搜索展示的内容和实际网页不一致")
            .add("侵犯个人隐私、侵权")
            .add("这条结果内容陈旧")
            .add("这条结果浏览体验差")
            .add("这条结果内容相关性差")
            .add("其他")
            .build();

        /**
         * 第二种:of
         */
        List<String> CONSTANT_LIST = ImmutableList.of("北京协和医院", "中日友好医院", "北京朝阳医院", "武汉协和医院");


        /**
         * 第三种:copy
         */
        List<String> CONSTANT_LIST = ImmutableList.copyOf(Lists.newArrayList("北京协和医院", "中日友好医院", "北京朝阳医院", "武汉协和医院"));

    }
}

ImmutableList 中元素不允许为 null。那么有没有办法将 null 值塞进去,用 Optional 包装一下 null。不过代码会变得稍微复杂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.collect.ImmutableList;

import java.util.List;
import java.util.Optional;

public class ImmutableListTest {

    public static void main(String[] args) {
        List<Optional<String>> immutableList = ImmutableList.of(
                Optional.ofNullable(null),
                Optional.of("a")
        );
        System.out.println(immutableList);
    }
}

结果:[Optional.empty, Optional[a]]

Maps

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Map map = Maps.newHashMap();
Map map = Maps.newTreeMap();
Map map = Maps.newLinkedHashMap();

ImmutableMap

ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对。

初始化ImmutableMap

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
初始化:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build();

在创建时放值:

Map<String, String> immutableMap = new ImmutableMap.Builder<String, String>()
            .put("1","网页打不开或提示内容已删除、无法找到该网页")
            .put("2","搜索展示的内容和实际网页不一致")
            .put("3", "侵犯个人隐私、侵权")
            .put("4", "这条结果内容陈旧")
            .put("5", "这条结果浏览体验差")
            .put("6", "这条结果内容相关性差")
            .put("7", "其他")
            .build();

创建后不可变:
immutableMap.put("k1","v3");//会抛出java.lang.UnsupportedOperationException

ImmutableMap中key和value均不能为null,放入null值会抛出NPE

注意:of方法入参最多只能有5对,如果添加的数据超过5对,需要改用builder方法.

Sets

代码语言:javascript
代码运行次数:0
运行
复制

ImmutableSet

ImmutableSet 中元素不允许为 null。那么有没有办法将 null 值塞进去,用 Optional 包装一下 null。不过代码会变得稍微复杂:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import com.google.common.collect.ImmutableSet;

import java.util.Optional;
import java.util.Set;

public class ImmutableSetTest {

    public static void main(String[] args) {
        Set<Optional<String>> immutableSet = ImmutableSet.of(
                Optional.ofNullable(null),
                Optional.ofNullable(null)
        );
        System.out.println(immutableSet);
    }

}

结果:[Optional.empty]

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
前端面试之CSS重点概念精讲
今天,我们又开辟了一个新的篇幅 --「前端面试」。即是把一些平时常用的概念和工具方法整理和罗列,也算是一种变向的「未雨绸缪」。
前端柒八九
2022/12/19
2.6K0
前端面试之CSS重点概念精讲
【前端面试题】04—33道基础CSS3面试题(附答案)
伴随着大量让人欣喜的功能加入HTML5,CSS3也同样为我们带来了更加绚丽的样式效果。
前端达人
2021/03/16
3.2K0
「资深前端工程师总结」前端面试知识点大全—CSS篇
display:none使用后,元素的宽度,高度都会丢失,视为不存在不加载;元素原来占据的空间位置不保留;产生回流和重绘;
用户5997198
2019/08/09
1.7K0
「资深前端工程师总结」前端面试知识点大全—CSS篇
分享 | 前端性能优化(CSS动画篇)
最近拜读了一下html5rocks上几位大神写的一篇关于CSS3动画性能优化的文章,学到了很多,在这里记录一下,其中的知识都是来源于这俩篇文章,我只是截取了其中比较关注的内容出来,原文地址High Performance Animations及Accelerated Rendering in Chrome
疯狂的技术宅
2019/03/28
2K0
浏览器渲染之回流重绘
回流和重绘是前端开发的高频词汇之一,你可以在各种面经,性能优化相关文章可以看到,但是很多都是草草带过。本文带你从浏览器渲染流程中了解回流与重绘的原理。
政采云前端团队
2021/09/30
1.8K0
浏览器渲染之回流重绘
每天10个前端小知识 【Day 13】
CSS position属性用于指定一个元素在文档中的定位方式。top,right,bottom 和 left 属性则决定了该元素的最终位置。
程序媛夏天
2024/01/18
3050
每天10个前端小知识 【Day 13】
从浏览器渲染层面解析css3动效优化原理
在h5开发中,我们经常会需要实现一些动效来让页面视觉效果更好,谈及动效便不可避免地会想到动效性能优化这个话题:
winty
2021/10/11
6520
从浏览器渲染层面解析css3动效优化原理
Web 性能优化-CSS3 硬件加速(GPU 加速)
上一篇文章学习了重绘和回流对页面性能的影响,是从比较宏观的角度去优化 Web 性能,本篇文章从每一帧的微观角度进行分析,来学习 CSS3 硬件加速的知识。
李振
2021/11/26
3.3K0
Web 性能优化-CSS3 硬件加速(GPU 加速)
干货 | 携程火车票7个优化动画性能的方法
携程火车票营销页使用 css 制作动画很多年了,这大大提高了动画给予页面丰富的视觉体验。不过,在开发的过程中,也遇到了一些性能相关问题和用户反馈,比如头部动画卡顿、页面打开时间较长、页面打开后部分数据加载时间较长等问题。为解决这些问题,我们借助性能检测工具定位问题,并查阅源码、文档等资源解决问题,形成了这篇文章。
携程技术
2023/09/06
3540
干货 | 携程火车票7个优化动画性能的方法
像素是怎样练成的
本来呢,最近在规划一篇关于浏览器的文章,但是在做文章架构梳理和相关资料查询的时候,发现「浏览器在渲染页面」的过程中,也别有洞天。索性,就单独将其作为一篇文章来写。
前端柒八九
2023/08/01
5550
像素是怎样练成的
CSS 强制启用 GPU 加速
最近在学校机房上前端课,用到了之前偶然看到的 CSS 的 GPU 渲染,性能肉眼可见提升。
Cesirdy
2023/05/29
1.2K0
一篇文章带你了解CSS基础知识和基本用法
相信做过网页的对Css都不是很陌生,它可以帮助我们重铸网页中很多绚丽的特效,尤其是现在Css已经发展3.0版本,很多功能更是丰富多彩,让我们的开发时间不仅大大缩短,而且还可以轻松做出许多华丽的特效,需要注意的是,Css相当于Html的一个美化装置,所以它必须依赖于Html才能发挥作用,那么今天我们就来深入了解下它吧。
前端皮皮
2020/11/26
11.7K0
一篇文章带你了解CSS基础知识和基本用法
49个常用的CSS代码片段,建议整理收藏
text-shadow 为网页字体添加阴影,通过对text-shadow属性设置相关的属性值。
前端达人
2021/07/16
2.3K0
57道常被问的CSS面试题及答案汇总,帮你查漏补缺
标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin
前端达人
2021/08/10
3K1
57道常被问的CSS面试题及答案汇总,帮你查漏补缺
抖音三面:硬件加速中的“层”和层叠上下文中的“层”,是一个东西吗?
在CSS属性改变时,重渲染会分为“回流”、“重绘”和“直接合成”三种情况,分别对应从“布局定位”/“图层绘制”/“合成显示”开始,再走一遍上面的流程。
用户9899350
2022/07/29
9131
抖音三面:硬件加速中的“层”和层叠上下文中的“层”,是一个东西吗?
深入了解——CSS3新增属性
写过 CSS 的人应该对 CSS 选择器不陌生,我们所定义的 CSS 属性之所以能应用到相应的节点上,就是因为 CSS 选择器模式。参考下述代码:
超然
2018/08/03
1.5K0
深入了解——CSS3新增属性
CSS3与页面布局学习总结(一)——概要、选择器、特殊性与刻度单位
web前端开发者最最注的内容是三个:HTML、CSS与JavaScript,他们分别在不同方面发挥自己的作用,HTML实现页面结构,CSS完成页面的表现与风格,JavaScript实现一些客户端的功能
张果
2018/01/04
1.7K0
CSS3与页面布局学习总结(一)——概要、选择器、特殊性与刻度单位
看不完的那种!前端170面试题+答案学习整理(良心制作)
圆角border-radius,阴影box-shadow,对文字加特效text-shadow,线性渐变gradient,变化transform,伪元素::selection,媒体查询,多栏布局,图片边框border-image。
达达前端
2021/01/18
11.9K0
CSS动画与GPU
那么问题是:已经小心遵守这些规则了,为什么动画还会卡顿、跳帧?还能优化吗?要从哪里入手?
ayqy贾杰
2023/03/15
2.5K0
CSS动画与GPU
几个前端工程师应当掌握的“词语”
HTML5学堂-码匠:W3C、BFC、FOUC、Hack、GPU、Sprite、UA……各类前端术语知多少? 有不少前端开发工程师,可能并不清楚下面的部分词语,但是在实战中其实都在使用着它们。 明确一
HTML5学堂
2018/03/13
9850
几个前端工程师应当掌握的“词语”
推荐阅读
相关推荐
前端面试之CSS重点概念精讲
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档