What's Guava
Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。
很多类似 Apache Common 的功能,但实现更优雅,项目也更活跃。
试图弥补 Java 语言的不足,很多特性被加入到最新的 Java 语言规范中。
Objects#equal
1
2
3
4
| Objects.equal("a", "a"); // return trueObjects.equal(null, "a"); // return falseObjects.equal("a", null); // return falseObjects.equal(null, null); // return true |
Java7 引入的 Objects 类提供了一样的方法 Objects.equals。
Objects#hashCode
1
2
3
| public int hashCode() { return Objects.hashCode(firstName, lastname, address);} |
Objects#toString
1
2
3
4
5
6
7
| public String toString() { return Objects.toStringHelper(this) .add("firstName", firstName) .add("lastName", lastName) .add("age", age) .toString();} |
高版本的 Guava 里的 toStringHelper 方法移到了 MoreObjects 里了。
Comparable
1
2
3
4
5
6
7
8
| public int compareTo(User that) { return CComparisonChain.start() .compare(this.firstName, that.firstName) .compare(this.lastName, that.lastName) .compare(this.age, that.age) .compareFalseFirst(this.locked, that.locked) .result();} |
PreConditions
1
2
3
| //Preconditions.checkNotNull(arg1, "参数 arg1 不正确,不能为空。");checkNotNull(arg1, "参数 arg1 不正确,不能为空。");checkArgument(arg2 > 18, "参数 arg2 不正确,值是%s,必须大于18。", arg2); |
| 方法声明 | 描述 | 检查失败时抛出的异常 |
|---|---|---|
| checkArgument(boolean) | 检查 boolean 是否为 true,用来检查传递给方法的参数。 | IllegalArgumentException |
| checkNotNull(T) | 检查 value 是否为 null,该方法直接返回 value,因此可以内嵌使用 checkNotNull。 | NullPointerException |
| checkState(boolean) | 用来检查对象的某些状态。 | IllegalStateException |
| checkElementIndex(int index, int size) | 列表、字符串或数组是否有效。index>=0 && index<size | IndexOutOfBoundsException |
| checkPositionIndex(int index, int size) | 检查index作为位置值对某个列表、字符串或数组是否有效。index>=0 && index<=size | IndexOutOfBoundsException |
| checkPositionIndexes(int start, int end, int size) | 检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效 | IndexOutOfBoundsException |
Optional#or
1
2
3
4
5
| String username = null;// String name = username != null ? username ? "游客";// String name = Objects.firstNonNull(username, "游客");String name = Optional.of(username).or("游客");System.out.println(name + "你好!"); // 游客你好! |
Return null — What's mean?
1
2
3
4
5
6
7
| // 可能会返回 nullUser user = User.getUserByName("tom");if(user != null) { user.doSomething();} else { admin.doSomething();} |
1
2
3
| // 可能会返回 nullOptional<User> user = User.getUserByName("tom");user.or(admin).doSomething(); |
Java8 里提供了 Optional:http://blog.jhades.org/java-8-how-to-use-optional/
Strings#split
1
2
3
4
5
| Iterable<String> strs = Splitter.on(",") .trimResults() .omitEmptyStrings() .split(",a,, b,");System.out.println(strs); // [a, b] |
Strings#utils
1
2
3
| Strings.padStart("521", 5, '0'); // 00521Strings.padEnd("33", 4, '#'); // 33##Strings.repeat("hello ", 3); // hello hello hello |
Strings#join
1
2
3
4
| Joiner.on(",") .skipNulls() .join(new String[] {"1", "5", null, "7"});// return "1,5,7" |
CharMatcher
1
2
3
4
5
6
7
8
9
10
11
12
13
| // 移除 control 字符CharMatcher.JAVA_ISO_CONTROL.removeFrom(string);// 只保留数字字符CharMatcher.DIGIT.relationFrom(string);// 去除两端的空格, 并把中间的连续空格替换成单个空格CharMatcher.WHITESPACE.trimAndCollapseFrom(string, ' ');// 用*号替换所有数字CharMatcher.JAVA_DIGIT.replaceFrom(string, '*');// 只保留数字和小写字母CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(string);// returns "constantName"CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "CONSTANT_NAME"); |
Collection - Multiset
1
2
3
4
5
6
| Multiset<String> votes =HashMultiset.create();votes.add("张三");votes.add("李四");votes.add("张三");int count = votes.count("张三"); // 返回2Set<String> strings = votes.elementSet(); // 不重复元素的Set |
Collection - Multimap
1
2
3
4
5
6
7
| Multimap<String, String> tags = ArrayListMultimap.create();tags.put("《红楼梦》", "好看");tags.put("《红楼梦》", "有内容");tags.put("《红楼梦》", "价格太贵");tags.put("《水浒》", "打打杀杀"); |
结构相当于Map<String, List
>但操作更便利。
Collection - Bimap
1
2
3
4
5
6
7
| BiMap<String, String> couple = HashBiMap.create();couple.put("梁山伯", "祝英台");couple.put("罗密欧", "朱丽叶");couple.inverse().get("朱丽叶"); // 返回 罗密欧couple.put("马文才", 祝英台"); // 抛出 IllegalArgumentException 异常 |
Collection - Table
1
2
3
4
5
6
7
8
| Table<String, String, Double> table = HashBasedtable.create();table.put("张三", "数学", 95.0);table.put("张三", "语文", 88.5);table.put("李四", "数学", 90.0);table.put("李四", "语文", 92.0);table.get("张三", "数学"); // 返回 95.0 |
Collection - utils
1
2
3
4
| // Java7 里的 List<String> list = new ArrayList<>();List<String> list1 = Lists.newArrayList();List<String> list2 = Lists.newArrayList("alpha, "beta", gamma");List<String> list3 = Lists.newArrayListWithExpectedSize(100); |
1
2
3
| List countUp = Ints.asList(1, 2, 3, 4, 5);List countDown = Lists.reverse(countUp); // {5, 4, 3, 2, 1}List<List> parts = Lists.partition(countUp, 2); // {{1,2}, {3,4}, {5}} |
1
2
3
4
5
6
7
| Map<String, Integer> left = ImmutableMap.of("a", 1, "b", 2, "c", 3);Map<String, Integer> right = ImmutableMap.of("b", 2, "d", 4);MapDifference<String, Integer> diff = Maps.difference(left, right);diff.entriesInCommon(); // {"b" => 2}diff.entriesOnlyOnLeft(); // {"a" => 1, "c" => 3}diff.entriesOnlyOnRight(); // {"d" => 4} |
Collection - Fuctional
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| boolean hasYoung = Iterables.any(users, new Predicate<User>() { @Override public boolean apply(@Nullable User user) { return user.getAge() < 18; }});boolean hasYoung = Iterables.all(users, new Predicate<User>() { @Override public boolean apply(@Nullable User user) { return user.getSex() == MALE; }});boolean hasYoung = Iterables.find(users, new Predicate<User>() { @Override public boolean apply(@Nullable User user) { return "Tom".equals(user.getName()); }});boolean hasYoung = Iterables.removeIf(users.iterator(), new Predicate<User>() { @Override public boolean apply(@Nullable User user) { return user.getAge() > 80; }}); |
Java8 Stream API
1
2
3
4
5
6
7
8
| Optional<String> reduced = stringCollection .stream() .sorted() .reduce((s1, s2) -> s1 + "#" + s2);reduced.ifPresent(System.out::println);// "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1" |
Supplier
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| static Supplier<DateAndDuration> yearEndSupplier;static { Supplier<DateAndDuration> supplier = new Supplier<DateAndDuration>() { @Override public DateAndDuration get() { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); calendar.clear(); calendar.set(year, 11, 31, 23, 59, 59); long duration =calendar.getTimeInMills() - new Date().getTime(); return new dateAndDuration(calendar.getTime(), duration); } }; yearEndSupplier = Suppliers.memoizeWithException(supplier, supplier.get() .getDuration(), TimeUnit.MICROSECONDS);}public static Date getYearEnd() { return yearEndSupplier.get().getDate();} |
Java8 中引入了 Supplier 接口:http://www.byteslounge.com/tutorials/java-8-consumer-and-supplier
Cache
1
2
3
4
5
6
7
8
9
10
11
12
| witerCache = CacheBuilder.newBuilder() .maximumSize(this.fileCacheSize).removalListener((RemovalListener) { try { objectObjectRemovalNotification.getValue().flush(); objectObjectRemovalNotificaiont.getValue().close(); if(log.isDebugEnabled()) { log.debug("释放文件写入的write。"); } } catche(IOException e) { log.error("关闭文件出错", e); }}).build(); |
Other
Math – 最大公约数、各种舍入、指数计算等等
IO – 文件拷贝、URL 访问、遍历文件目录等等 EventBus / 多线程 / Range
转载请并标注: “本文转载自 linkedkeeper.com (文/张松然)”