简介
Guava[ˈɡwɑːvə]
是 Google 开源的一个 Java 工具库。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
Lists
Guava 的 Lists 类全路径:com.google.common.collect.Lists
代码语言:javascript复制import com.google.common.collect.Lists;
List list = Lists.newArrayList();
List list = Lists.newLinkedList();
备注:
Lists.newArrayList()和new ArrayList()是一样的,没有区别
描述:将其他 Collection 类型的集合转换成 ArrayList
代码语言:javascript复制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复制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复制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复制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复制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复制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复制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复制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复制[ɪˈ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复制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复制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复制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复制Map map = Maps.newHashMap();
Map map = Maps.newTreeMap();
Map map = Maps.newLinkedHashMap();
ImmutableMap
ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对。
初始化ImmutableMap
代码语言:javascript复制初始化:
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复制
ImmutableSet
ImmutableSet 中元素不允许为 null。那么有没有办法将 null 值塞进去,用 Optional 包装一下 null。不过代码会变得稍微复杂:
代码语言:javascript复制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]