<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.0.1-jre</version>
</dependency>
1.Strings.isNullOrEmpty(input);//input为null或者""。
2.Strings.commonPrefix(a,b);//获得两个字符串相同的前缀
3.Strings.commonSuffix(c,d);//获得两个字符串相同的后缀
4. Strings.padEnd("3", 4, '0');//补全字符串3000
5. Strings.padStart("1", 2, '0');//补全字符串01
6.Objects.equal(a, b)//比较两个对象是否相等,避免做是否为空的判断
7.Splitter类来拆分字符串:
Iterable<String> splitResults = Splitter.onPattern("[,,]{1,}") .trimResults() .omitEmptyStrings() //忽略空字符串 .split("hello,word,,世界,水平"); //hello word 世界 水平
二次拆分:
String toSplitString = "a=b;c=d,e=f"; Map<String, String> kvs = Splitter.onPattern("[,;]{1,}").withKeyValueSeparator('=').split(toSplitString); for (Map.Entry<String, String> entry : kvs.entrySet()) { System.out.println(String.format("%s,%s", entry.getKey(), entry.getValue())); }//a,b c,d e,f
8.Joiner类来做字符串的合并
String joinResult = Joiner.on(";").join(new String[]{"hello","world"});//hello;world Map<String, String> map = new HashMap<>(); map.put("a", "b"); map.put("c", "d"); String mapJoinResult = Joiner.on(",").withKeyValueSeparator("=").join(map); System.out.println(mapJoinResult);//a=b,c=d
9.Preconditions类用来做参数的校验
- checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出IllegalArgumentException异常
- checkState 和checkArgument参数和实现基本相同,从字面意思上我们也可以知道这个方法是用来判断状态是否正确的,如果状态不正确会抛出IllegalStateException异常
- checkNotNull方法用来判断参数是否不是null,如果为null则会抛出NullPointerException空指针异常
- checkElementIndex方法用来判断用户传入的数组下标或者list索引位置,是否是合法的,如果不合法会抛出IndexOutOfBoundsException
- checkPositionIndexes方法的作用和checkElementIndex方法相似,只是此方法的索引范围是从0到size包括size,而上面的方法不包括size。
-
public static void main(String[] args) { doSomething("Jim", 19, "hello world, hello java"); } public static void doSomething(String name, int age, String desc) { Preconditions.checkNotNull(name, "name may not be null"); Preconditions.checkArgument(age >= 18 && age < 99, "age must in range (18,99)"); Preconditions.checkArgument(desc !=null && desc.length() < 10, "desc too long, max length is ", 10); }
- Exception in thread "main" java.lang.IllegalArgumentException: desc too long, max length is [10]
at com.google.common.base.Preconditions.checkArgument(Preconditions.java:189)
at com.bfxy.rabbitmq.quickstart.A.doSomething(A.java:19)
at com.bfxy.rabbitmq.quickstart.A.main(A.java:13)
10.不可变集合
Set<String> immutableNamedColors = ImmutableSet.<String>builder() .add("red", "green","black","white","grey") .build(); immutableNamedColors.add("abc"); //Exception in thread "main" java.lang.UnsupportedOperationException
Set<String> immutableNamedColors = ImmutableSet.of("red","green","black","white","grey");
Set<String> immutableNamedColors = ImmutableSet.copyOf(new String[]{"red","green","black","white","grey"});
ImmutableList<String> list = ImmutableSet.copyOf(new String[]{"red", "green", "black", "white", "grey"}).asList();
11.Multiset
Multiset multiset = HashMultiset.create(); String sentences = "this is a story, there is a good girl in the story."; Iterable<String> words = Splitter.onPattern("[^a-z]{1,}").omitEmptyStrings().trimResults().split(sentences); for (String word : words) { multiset.add(word); } for (Object element : multiset.elementSet()) { System.out.println((String)element + ":" + multiset.count(element)); }
the:1
a:2
in:1
there:1
this:1
is:2
girl:1
good:1
story:2
- HashMultiset: 元素存放于 HashMap
- LinkedHashMultiset: 元素存放于 LinkedHashMap,即元素的排列顺序由第一次放入的顺序决定
- TreeMultiset:
元素被排序存放于
TreeMap - EnumMultiset: 元素必须是 enum 类型
- ImmutableMultiset: 不可修改的 Mutiset
12.BiMap:双向Map
BiMap<String,String> weekNameMap = HashBiMap.create(); weekNameMap.put("星期一","Monday"); weekNameMap.put("星期二","Tuesday"); weekNameMap.put("星期三","Wednesday"); weekNameMap.put("星期四","Thursday"); weekNameMap.put("星期五","Friday"); weekNameMap.put("星期六","Saturday"); weekNameMap.put("星期日","Sunday"); System.out.println("星期日的英文名是" + weekNameMap.get("星期日"));//星期日的英文名是Sunday System.out.println("Sunday的中文是" + weekNameMap.inverse().get("Sunday"));//Sunday的中文是星期日
- HashBiMap: key 集合与 value 集合都有 HashMap 实现
- EnumBiMap: key 与 value 都必须是 enum 类型
- ImmutableBiMap: 不可修改的 BiMap
13.Multimaps:一键多值的Map
Multimap<String, String> myMultimap = ArrayListMultimap.create(); // 添加键值对 myMultimap.put("Fruits", "Bannana"); //给Fruits元素添加另一个元素 myMultimap.put("Fruits", "Apple"); myMultimap.put("Fruits", "Pear"); myMultimap.put("Vegetables", "Carrot"); // 获得multimap的size int size = myMultimap.size(); System.out.println(size); // 4 // 获得Fruits对应的所有的值 Collection<String> fruits = myMultimap.get("Fruits"); System.out.println(fruits); // [Bannana, Apple, Pear] Collection<String> vegetables = myMultimap.get("Vegetables"); System.out.println(vegetables); // [Carrot] // Removing a single value myMultimap.remove("Fruits","Pear"); System.out.println(myMultimap.get("Fruits")); // [Bannana, Apple] // Remove all values for a key myMultimap.removeAll("Fruits"); System.out.println(myMultimap.get("Fruits")); // [] (Empty Collection!)
14.使用Iterators简化Iterator操作
List<String> list = Lists.newArrayList("Apple","Pear","Peach","Banana"); Predicate<String> condition = new Predicate<String>() { @Override public boolean apply(String input) { return input.startsWith("P"); } }; boolean allIsStartsWithP = Iterators.all(list.iterator(), condition);//false
boolean allIsStartsWithP = Iterators.any(list.iterator(), condition);//true
String secondElement = Iterators.get(list.iterator(), 1);//Pear
Iterator<String> startPElements = Iterators.filter(list.iterator(), new Predicate<String>() { @Override public boolean apply(String input) { return input.startsWith("P"); } });//Pear Peach
String length5Element = Iterators.find(list.iterator(), new Predicate<String>() { @Override public boolean apply(String input) { return input.length() == 5; } });//Apple
Iterator<Integer> countIterator = Iterators.transform(list.iterator(), new Function<String, Integer>() { @Override public Integer apply(@Nullable String s) { return s.length(); } });//5 4 5 6