当前位置 : 首页 » 文章分类 :  开发  »  Google-Guava使用笔记

Google-Guava使用笔记

Google Java类库Guava使用笔记

google/guava 官网
https://github.com/google/guava

官方API文档
https://google.github.io/guava/releases/snapshot-jre/api/docs/

官方User Guide
https://github.com/google/guava/wiki


Guava Cache

集中式内存缓存Guava Cache
https://www.jianshu.com/p/64b0df87e51b


Preconditions入参检查

package com.google.common.base;

@GwtCompatible
public final class Preconditions {
  public static void checkArgument(boolean expression, @Nullable Object errorMessage) {
      if (!expression) {
          throw new IllegalArgumentException(String.valueOf(errorMessage));
      }
  }

  public static void checkState(boolean expression, @Nullable Object errorMessage) {
      if (!expression) {
          throw new IllegalStateException(String.valueOf(errorMessage));
      }
  }
}

由于Preconditions中所有方法都是static的,使用的时候一般静态导入即可,比如:

import static com.google.common.base.Preconditions.checkState;

private void method(long userId, String orderId, Request request) {
    checkArgument(userId > 0, "Required long param userId is invalid");
    checkState(StringUtils.isNotBlank(orderId), "Required String param orderId is not present");
    checkState(request != null, "Required param request is not present");
    ... ...
}

Splitter

逗号分隔字符串转List

com.google.common.base.Splitter

String userIds = "11,22,aa,bb"
List<Long> userIdList = Splitter.on(',').splitToList(userIds).stream().filter(StringUtils::isNumeric).map(Long::parseLong).collect(Collectors.toList());

Splitter.on(‘,’).split(“ foo,,, bar ,”) 结果为: [“ foo”, “”, “”, “ bar “, “”]
其中包含了空的字符串,这可能不是我们需要的,可以通过Splitter类中的trimResults()方法去掉子串的空格,
List<String> result = Splitter.on(",").trimResults().splitToList(str);

以及omitEmptyStrings()方法去掉空的子串。运行之后的结果为[“foo”, “bar”]。
Splitter.on(‘,’).limit(3).omitEmptyStrings().split(“a,,,b,,,c,d”) 结果为 [“a”, “b”, “c,d”]

Splitter类还提供了limit(int limit)方法,当分割的子字符串达到了limit个时,则停止分割,如下:
Splitter.on(‘,’).limit(3).split(“a,b,c,d”) 结果为[“a”, “b”, “c,d”]

Splitter解析url查询参数

MapSplitter
对url中的查询字符串”id=123&name=green”进行分割
利用Guava的MapSplitter的代码如下:

final Map<String, String> join = Splitter.on("&").withKeyValueSeparator("=").split("id=123&name=green");

这里同样利用on传入字符串的第一分隔符,withKeyValueSeparator传入项的分隔符,产生map的key/value项,其结果是一个{id=123, name=green}的Map对象。


Joiner

对于MapJoinner和MapSplitter的最好案例就是url的param编码。

Joiner拼接url查询参数

MapJoinner
生产一个查询id: 123,name: green的学生信息的url。
利用Guava的MapJoinner的代码如下:

Joiner.on("&").withKeyValueSeparator("=").join(ImmutableMap.of("id", "123", "name", "green"));

这里采用了on传入map item之间分隔符,以及withKeyValueSeparator传递map项key/value之间的分隔符。所以能够很简单的实现,不用我们在去实现一个的for循环代码。

String baseUrl = "/api/v1/users/%s/hello";
Map<String, String> body = Maps.newHashMap();
body.put("city_id", "11010000");
body.put("name", RandomStringUtils.randomAlphabetic(10));
body.put("mobile", "98762000970");

Long userId = 1001;
String url = String.format(baseUrl, userId);
doPOST(url, Joiner.on('&').withKeyValueSeparator("=").join(body))
                .andExpect(MockMvcResultMatchers.status().isOk())

guava之Joiner 和 Splitter
https://www.cnblogs.com/whitewolf/p/4214749.html

List转逗号分隔字符串

public static String joinByGuava(List stringList, String delimiter) {

  return Joiner.on(delimiter).skipNulls().join(stringList);
}

当然我们也可以用common-lang来很简单的完成:StringUtils.join(stringList, delimiter).但是个人推荐尽量使用Guava替代common-lange,因为Guava还有更多的有用方法,后续会陆续介绍,还有就是Guava的API相对更有语意一点。


Maps

package com.google.common.collect;
@GwtCompatible( emulated = true )
public final class Maps

GwtCompatible 表示该类型兼容Google Web Toolkit

newHashMap()创建HashMap

public static <K,V> HashMap<K,V> newHashMap()

例如:

Map<String, Map<String, String>> mobileMessageMap = Maps.newHashMap();
Map<String, String> messageMap = Maps.newHashMap();
messageMap.put("messageKey", "messageBody");
mobileMessageMap.put("18688888888", messageMap);

uniqueIndex()

Maps.uniqueIndex(Iterable,Function)通常针对的场景是:有一组对象,它们在某个属性上分别有独一无二的值,而我们希望能够按照这个属性值查找对象

这个方法返回一个Map,键为Function返回的属性值,值为Iterable中相应的元素,因此我们可以反复用这个Map进行查找操作。

比方说,我们有一堆字符串,这些字符串的长度都是独一无二的,而我们希望能够按照特定长度查找字符串:

ImmutableMap<Integer, String> stringsByIndex = Maps.uniqueIndex(strings,
    new Function<String, Integer> () {
        public Integer apply(String string) {
            return string.length();
        }
    });

如果索引值不是独一无二的,请参见下面的Multimaps.index方法。

[Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
http://ifeve.com/google-guava-collectionutilities/


Multimaps

index

通常针对的场景是:有一组对象,它们有共同的特定属性,我们希望按照这个属性的值查询对象,但属性值不一定是独一无二的。

比方说,我们想把字符串按长度分组。

ImmutableSet digits = ImmutableSet.of("zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine");
Function<String, Integer> lengthFunction = new Function<String, Integer>() {
    public Integer apply(String string) {
        return string.length();
    }
};

ImmutableListMultimap<Integer, String> digitsByLength= Multimaps.index(digits, lengthFunction);
/*
*  digitsByLength maps:
*  3 => {"one", "two", "six"}
*  4 => {"zero", "four", "five", "nine"}
*  5 => {"three", "seven", "eight"}
*/

[Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具
http://ifeve.com/google-guava-collectionutilities/


Sets

package com.google.common.collect;
@GwtCompatible( emulated = true )
public final class Sets {
  ...
}

newHashSet()创建HashSet

public static <E> HashSet<E> newHashSet()

例如:

Set<String> emails = Sets.newHashSet();
emails.add("aa@aaa.com");
emails.add("bbb@bb.com");

Set<String> emails = Sets.newHashSet("aa@aaa.com","bbb@bb.com");

求集合的交集/差集/并集

package com.uwo9.test08;

import java.util.Set;

import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;

/**
 * 集合的操作:交集、差集、并集
 * Sets.intersection()交集
 * Sets.difference()差集
 * Sets.union()并集
 */
public class Test04 {

    public static void main(String[] args) {
        Set<Integer> sets = Sets.newHashSet(1, 2, 3, 4, 5, 6);
        Set<Integer> sets2 = Sets.newHashSet(3, 4, 5, 6, 7, 8, 9);
        // 交集
        System.out.println("交集为:");
        SetView<Integer> intersection = Sets.intersection(sets, sets2);
        for (Integer temp : intersection) {
            System.out.println(temp);
        }
        // 差集
        System.out.println("差集为:");
        SetView<Integer> diff = Sets.difference(sets, sets2);
        for (Integer temp : diff) {
            System.out.println(temp);
        }
        // 并集
        System.out.println("并集为:");
        SetView<Integer> union = Sets.union(sets, sets2);
        for (Integer temp : union) {
            System.out.println(temp);
        }
    }

}

java guava 集合的操作:交集、差集、并集
https://blog.csdn.net/huanyinghanlang/article/details/78774652

求List的差集(先转Set求差集再转回List)

List<Long> userIds1 = Lists.newArrayList(12L, 23L, 34L);
List<Long> userIds2 = Lists.newArrayList(12L, 23L);

// 差集
List<Long> userIdsDifference = Sets.difference(Sets.newHashSet(userIds1), Sets.newHashSet(userIds2)).stream()
        .collect(Collectors.toList());

上一篇 Postman使用笔记

下一篇 Apache-Commons-Collections使用笔记

阅读
1,411
阅读预计7分钟
创建日期 2018-06-29
修改日期 2018-11-14
类别
百度推荐