乐趣区

高质量的Google-Guava库

高质量的 GoogleGuava 库

GoogleGuava 辅助库是 java1.6 及以上的类库集合的扩展项目
里面包含大量高质量的 API 可以使你的 Java 代码更加优雅,更加简洁,让你工作更加轻松愉悦
本文章主要向大家介绍 guava 库的基本使用和小编抽取的一些不错操作

先上 jar 包下载地址

  • https://www.jb51.net/softs/54…
    安装难度并不大 所以不做太多介绍
    ps: 虽然不是官网 但是很稳定哦

Guava 流畅的基本工具 Basic utilities

  • Optional 使用和避免 null

    Optional 小编觉得更重要的不是代码本身 而是给程序员一种神经提示 进而带动程序员积极思考引用缺失的问题

    • 由于基本工具所要举得例子不是很多 在此小编直接贴入网址在这里会有更好的对 Guava 基本工具的解析
    • https://wiki.jikexueyuan.com/…

Guava 对集合的强力扩展 collect

Guava 对已有集合的能力增强

  • 可变集合的创建 Lists、Sets、Maps、Collections2

    针对 jdk 中已存在的集合建立的工具类

//jdk 中的普通方式
Map<String,String> mp=new HashMap<>();
//Guava 中的方式
List<String> list = Lists.newArrayList();
Set<String> set = Sets.newHashSet();
Map<String, String> map = Maps.newHashMap();
// 当然也可以利用静态导入的方式让代码更简单
List<String> list = newArrayList();
// 关于 Eclipse 中设置静态导入在文章结尾会跟大家介绍
  • 不可变集合的创建 ImmutableCollection、ImmutableMap

    在多线程操作下,是线程安全的
    比可变集合更有效的利用资源
    中途不能添加或更改元素
    通常我们需要一个测试集合的时候便可以用到此接口
    ps: jdk9 也已经实现类似方法

var list=ImmutableList.of("1","2","3","4");
var set=ImmutableSet.of("a", "b", "c", "d");
var map=ImmutableMap.of("key1", "value1", "key2", "value2");
//jdk9 中的创建不可变集合的方式也很简单
List.of("Hello", "World");
Set.of("Hello", "World");
Map.of("Hello", 1, "World", 2);
  • 更智能的 ImmutableXXX.copyOf
    会尝试在安全的时候避免做拷贝——实际的实现细节不详,但通常来说是很智能的
  • 关于不可变并且有序集合 ImmutableSortedxxx
var set=ImmutableSortedSet.of(2,1,3,2,5,4);
out.println(set);
//1,2,3,4,5   排序并且排重

Guava 中新增的牛 X 集合

  • Multiset

    可以用两种方式看待 Multiset:

    • 没有元素顺序限制的 ArrayList
    • Map<E, Integer>,键为元素,值为计数

    Multiset 没有继承 Set 接口 不等于 Set
    常用 Multiset 接口的实现类有:

    • HashMultiset: 元素存放于 HashMap
    • LinkedHashMultiset: 元素存放于 LinkedHashMap,即元素排列顺序由第一次放入的顺序决定
    • TreeMultiset: 元素被排序存放于 TreeMap
    • EnumMultiset: 元素必须是 enum 类型
    • ImmutableMultiset: 不可修改的 Mutiset

    Multiset 接口定义的抽象方法主要有:

    • add(E element) : 向其中添加单个元素
    • add(E element,int occurrences) : 向其中添加指定个数的元素
    • count(Object element) : 返回给定参数元素的个数
    • remove(E element) : 移除一个元素,其 count 值 会响应减少
    • remove(E element,int occurrences): 移除相应个数的元素
    • elementSet() : 将不同的元素放入一个 Set 中
    • entrySet(): 类似与 Map.entrySet 返回 Set<Multiset.Entry>。包含的 Entry 支持使用 getElement()和 getCount()
    • setCount(E element ,int count): 设定某一个元素的重复次数
    • setCount(E element,int oldCount,int newCount): 将符合原有重复个数的元素修改为新的重复次数
    • retainAll(Collection c) : 保留出现在给定集合参数的所有的元素 
    • removeAll(Collectionc) : 去除出现在给定集合参数的所有的元素
HashMultiset<String> multiSet = HashMultiset.create(); 
multiSet.add("1");
multiSet.add("1");
multiSet.add("2");
multiSet.add("3", 3);
out.println(multiSet.count("1")+"次");
// 2 次
out.println(multiSet);
//[1 x 2, 2, 3 x 3]
out.println("元素个数"+multiSet.size());
// 元素个数 6 
  • MultiMap

    ps: 不是 Map
    可以用两种方式思考 Multimap 的概念:

    • ”键 - 单个值映射”的集合:
      a -> 1 a -> 2 a ->4 b -> 3 c -> 5
    • 或者”键 - 值集合映射”的映射:
      a -> [1, 2, 4] b -> 3 c -> 5

      常用实现类:
      在大多数要使用 Map<K, Collection> 的地方,你都可以使用它们:

实现类 键行为对应的集合 值行为对应的集合
ArrayListMultimap HashMap ArrayList
HashMultimap HashMap HashSet
LinkedListMultimap LinkedHashMap LinkedList
LinkedHashMultimap LinkedHashMap LinkedHashMap
TreeMultimap TreeMap TreeSet
ImmutableSetMultimap ImmutableMap ImmutableSet
 List<Integer> list = newArrayList();
         list.add(4);
         list.add(5);
         list.add(6);
ListMultimap<String,Integer> Multimap =ArrayListMultimap.create();
         Multimap.put("1",1);
         Multimap.put("1",2);
         Multimap.put("1",3);
         Multimap.putAll("2",list);
out.println(Multimap);
//{1=[1, 2, 3], 2=[4, 5, 6]}
  • BiMap 键值双向映射的 map

    • 可以用 inverse()反转 BiMap<K, V> 的键值映射
    • 保证值是唯一的,因此 values()返回 Set 而不是普通的 Collection
键 - 值实现 值 - 键实现 对应的 BiMap 实现
HashMap HashMap HashBiMap
ImmutableMap ImmutableMap ImmutableBiMap
EnumMap EnumMap EnumBiMap
EnumMap HashMap EnumHashBiMap
BiMap<Integer,String> biMap = HashBiMap.create();
         biMap.put(1, "1");
         biMap.put(4, "2");
         biMap.put(3, "3");
         // 添加已有的值将新键覆盖旧键 forcePut
         biMap.forcePut(2, "2");
out.println(biMap);//{1=1, 3=3, 2=2}
// 将键值切换映射 inverse
var biMap2 = bimap.inverse();
out.println(biMap2.get("1"));//1
  • Table 多键检索的 Map

    • 它有两个支持所有类型的键:”行”和”列”。
    • Table 提供多种视图,以便从各种角度使用它

    常用实现类:

    • HashBasedTable:本质上用 HashMap<R, HashMap<C, V>> 实现;
    • TreeBasedTable:本质上用 TreeMap<R, TreeMap<C,V>> 实现;
    • ImmutableTable:本质上用 ImmutableMap<R, ImmutableMap<C, V>> 实现;注:ImmutableTable 对稀疏或密集的数据集都有优化。
    • ArrayTable:要求在构造时就指定行和列的大小,本质上由一个二维数组实现,以提升访问速度和密集 Table 的内存利用率。ArrayTable 与其他 Table 的工作原理有点不同,请参见 Javadoc 了解详情。
Table<Integer,String,String> table = HashBasedTable.create();
         table.put(1, "Asen", "百万");
         table.put(1, "Bsen", "百万");
         table.put(2,"Bsen","千万");
// 双键查值
out.println(table.get(2, "Bsen"));
// 行视图
out.println(table.row(1));
{Asen= 百万, Bsen= 百万}
// 列视图
out.println(table.column("Bsen"));
{1= 百万, 2= 千万}

Guava 对字符串的处理

小编这里额外说明一下:关于对字符串的处理小编觉得 Guava 是最棒的 综合性能更是没话说 下面各位慢慢欣赏

  • Joiner 连接器

  • join 拼接集合中的元素
String join = Joiner.on("-_-").join(List.of("1", "2","3","4"));
// 比 stream 先进的是  此方法可以支持任意类型  stream 针对字符串之外还要先进行处理
String join2 = Joiner.on("-_-").join(List.of(5,6,7,8));
out.println(join);
//1-_-2-_-3-_-4
out.println(join2);
//5-_-6-_-7-_-8
  • skipNullls 过滤 null
String join3 = Joiner.on("~_~")
                     .skipNulls()
                     .join("1",null,"2","3");
out.println(join3);//1~_~2~_~3
  • useForNull 替换 null
String join4 = Joiner.on("~_~")
                     .useForNull("空")
                     .join("1",null,"2","3");
out.println(join4);//1~_~ 空~_~2~_~3
  • withKeyValueSeparator 拼接 Map 中元素
// 此时的字符串拼接则将 Map 中一个键值对看为一个整体 进行拼接
String join5 = Joiner.on("~_~")
.withKeyValueSeparator("值:")
.join(Map.of(1,10,2,20));
out.println(join5);// 1 值:10~_~2 值:20
  • Splitter 字符分割

  • split、splitToList 根据指定字符分割字符串,并转集合
Iterable<String> split = Splitter.on(";")
                                 .split("12;34;56;7");
split.forEach(out::println);
//12 34 56 7
// ps: 如果找不到指定字符则返回原字符串
  • trimResults 将指定 charmatcher 转空串
List<String> splitToList = Splitter.on(";")
                                   .trimResults(CharMatcher.anyOf("a"))
                                   .splitToList("aa;b");
// [, b]
  • limit 指定分割个数
List<String> list=Splitter.on(";")
                          .limit(2)
                          .splitToList("a;b;c");
//a  b;c
List<String> list=Splitter.on(";")
                          .limit(3)
                          .splitToList("a;b;c");
//a    b   c
  • withKeyValueSeparator 转为 Map
 Map<String, String> split3 = Splitter.on(";")
                                      .withKeyValueSeparator("-")
                                      .split("a-10;b-20");
split3.forEach((k,v)->out.println(k+"="+v));
//a=10    b=20
  • CharMatcher 字符匹配器

    根据要求获取匹配器类型:
    ANY: 匹配任何字符
    ASCII: 匹配是否是 ASCII 字符
    BREAKING_WHITESPACE: 匹配所有可换行的空白字符(不包括非换行空白字符, 例如 ”\u00a0″)
    DIGIT: 匹配 ASCII 数字 
    INVISIBLE: 匹配所有看不见的字符
    JAVA_DIGIT: 匹配 UNICODE 数字, 使用 Character.isDigit() 实现
    JAVA_ISO_CONTROL: 匹配 ISO 控制字符, 使用 Charater.isISOControl() 实现
    JAVA_LETTER: 匹配字母, 使用 Charater.isLetter() 实现
    JAVA_LETTER_OR_DIGET: 匹配数字或字母
    JAVA_LOWER_CASE: 匹配小写
    JAVA_UPPER_CASE: 匹配大写
    NONE: 不匹配所有字符
    SINGLE_WIDTH: 匹配单字宽字符, 如中文字就是双字宽
    WHITESPACE: 匹配所有空白字符
    anyOf(CharSequence): 枚举匹配字符 如 anyOf(“aeiou”) 匹配小写英语元音
    is(char): 给定单一字符匹配
    inRange(char,char): 给定字符范围匹配 如 inRange(‘a’,’z’)
    对获取到的匹配器进行处理:
    collapseFrom(CharSequence,   char) 把每组连续的字符替换为指定字符
    matchesAllOf(CharSequence) 测试是否字符序列中的所有字符都匹配。
    removeFrom(CharSequence) 从字符序列中移除所有匹配字符。
    retainFrom(CharSequence) 在字符序列中保留匹配字符,移除其他字符。
    trimFrom(CharSequence) 移除字符序列的前导匹配字符和尾部匹配字符。
    replaceFrom(CharSequence,   CharSequence) 用特定字符序列替代匹配字符。
    更多方法还请参考:https://www.cnblogs.com/amei0…

// 两个简单的栗子:// 求出字符串中英文字母的个数
var string="ab2dA-+=wq1c390";
var vstr=CharMatcher.JAVA_LETTER.retainFrom(string);
out.println(vstr);//abdAwqc
// 过滤掉字符串中的数字
var string="12345hello90word";
var vint=CharMatcher.inRange('0', '9').removeFrom(string);
out.println(vstr);//helloword
// 将字符串中任意长度空格用指定字符代替
String rs = CharMatcher
            .whitespace()
            .collapseFrom("42d3   gfsdg4f afdasf        dasf3f",'、');
  • 当然了 这只是 Guava 的一小部分更多精彩内容还请参考一下网址:
    http://ifeve.com/google-guava/
    https://wiki.jikexueyuan.com/…

关于 Eclipse 静态导包问题

静态导包显然能让代码显得更简洁干练
下面具体说明 EclipseMyEclipse 如何设置指定静态导包

  • 确认开启静态导入选项 Window->Preferences->Java->Editor->Content Assist 页面选中 Use static imports
  • 新键默认静态导入字段 Window->Preferences->Java->Editor->Content Assist->Favorites
  • 使用方法:
    快捷键导入还是不会导入静态字段的 这时候我们要手动敲出比如 out 然后 ALT+/ 提示选项第一个就是自动补全加默认静态导包了
退出移动版