1.基本工具 [Basic utilities]

之前看到的介绍guava的文章,把之前总结的整理了下

原文链接:Google Guava官方教程(中文版)

1. 基本工具 [Basic utilities]

让使用Java语言变得更舒适

1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受

1.2 前置条件: 让方法中的条件检查更简单

1.3 常见Object方法: 简化Object方法实现,如hashCode()和toString()

1.4 排序: Guava强大的”流畅风格比较器”

1.5 Throwables:简化了异常和错误的传播与检查


package com.insightfullogic.java8.test;

import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by user on 2018/6/30.
 * guava学习笔记1,参考地址:http://ifeve.com/google-guava/
 * 1.基本工具 [Basic utilities]
 * 1.1 使用和避免null:null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受
 * 1.2 前置条件: 让方法中的条件检查更简单
 * 1.3 常见Object方法: 简化Object方法实现,如hashCode()和toString()
 * 1.4 排序: Guava强大的”流畅风格比较器”
 * 1.5 Throwables:简化了异常和错误的传播与检查
 * @author:bxy
 * @Description:
 * @Date:Created in 18:07 on 2018/6/30.
 */
public class GuavaTest1 {
    public static void main(String[] args) {
        try {
            GuavaTest1 a = new GuavaTest1();
            a.test1_1();
            a.test1_2();
            a.test1_3();
            a.test1_4();
            a.test1_5();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void test1_1(){
        //Optional.of(T)
        Optional p = Optional.of(5);
        p.isPresent(); // returns true
        System.out.println(p.get()); // returns 5
        try {
            Optional.of(null);// 若引用为null则快速失败
        } catch (NullPointerException e) {
        }

        //Optional.absent() 创建引用缺失的Optional实例
        Optional o1 = Optional.absent();
        System.out.println(o1.isPresent());

        //Optional.fromNullable(T) 返回一个包含给定数值的Present, 如果是null值, 返回具有某种类型的Absent.INSTANCE
        o1 = Optional.fromNullable(11);
        System.out.println(o1.get());
        o1 = Optional.fromNullable(null);
        System.out.println(o1.isPresent());

        //非静态方法
        //boolean isPresent()   如果Optional包含非null的引用(引用存在),返回true
        //T get()               返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException
        //T or(T)               返回Optional所包含的引用,若引用缺失,返回指定的值
        //T orNull()            返回Optional所包含的引用,若引用缺失,返回null
        //Set asSet()        返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。
        Optional possible = Optional.of(5);
        if (possible.isPresent()) { // true
            System.out.println(possible.get()); // 5
        }
        System.out.println(possible.asSet()); // [5]

        Optional absentValue = Optional.absent();
        if (absentValue.isPresent()) { // false
            System.out.println(absentValue.get());
        }
        System.out.println(absentValue.or(-1)); // -1
        System.out.println(absentValue.orNull()); // null
        System.out.println(absentValue.asSet()); // []

        // absent is not null
        //Objects.firstNonNull 新版本替换为MoreObjects.firstNonNull
        System.out.println(MoreObjects.firstNonNull(possible, absentValue)); // Optional.of(5)
        System.out.println(MoreObjects.firstNonNull(absentValue, possible)); // Optional.absent()
        System.out.println(MoreObjects.firstNonNull(absentValue, absentValue)); // Optional.absent()

        Optional nullValue = Optional.fromNullable(null);
        if (nullValue.isPresent()) { // false
            System.out.println(nullValue.get());
        }
        System.out.println(nullValue.or(-1)); // -1
        System.out.println(nullValue.orNull()); // null
        System.out.println(nullValue.asSet()); // []

        System.out.println(MoreObjects.firstNonNull(possible, nullValue)); // Optional.of(5)
        System.out.println(MoreObjects.firstNonNull(nullValue, possible)); // Optional.absent()
        System.out.println(MoreObjects.firstNonNull(nullValue, nullValue)); // Optional.absent()

        System.out.println(MoreObjects.firstNonNull(null, 1)); // 1
        System.out.println(MoreObjects.firstNonNull(1, null)); // 1
//        System.out.println(MoreObjects.firstNonNull(null, null)); // cause a java.lang.NullPointerException,新版本不能同时为null
    }

    /**
     * 1.2 方法声明(不包括额外参数)                          描述      检查失败时抛出的异常
     * checkArgument(boolean)                               检查boolean是否为true,用来检查传递给方法的参数。                              IllegalArgumentException
     * checkNotNull(T)                                      检查value是否为null,该方法直接返回value,因此可以内嵌使用checkNotNull。        NullPointerException
     * checkState(boolean)                                  用来检查对象的某些状态。                                                     IllegalStateException
     * checkElementIndex(int index, int size)               检查index作为索引值对某个列表、字符串或数组是否有效。index>=0 && index=0 && index<=size *  IndexOutOfBoundsException
     * checkPositionIndexes(int start, int end, int size)   检查[start, end]表示的位置范围对某个列表、字符串或数组是否有效*                 IndexOutOfBoundsException
     */
    public void test1_2() throws Exception {
        getPersonByPrecondition(8,"peida");
        try {
            getPersonByPrecondition(-9,"peida");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        try {
            getPersonByPrecondition(8,"");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        try {
            getPersonByPrecondition(8,null);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    public static void getPersonByPrecondition(int age, String neme) throws Exception {
        Preconditions.checkNotNull(neme, "neme为null");
        Preconditions.checkArgument(neme.length() > 0, "neme为\'\'");
        Preconditions.checkArgument(age > 0, "age 必须大于", 0);
        System.out.println("a person age:" + age + ",neme:" + neme);
    }

    //新版本把Objects改为了MoreObjects,很多功能被jdk Objects吸收
    public void test1_3(){
//        MoreObjects mp=;
        System.out.println(Objects.equal("a", "a")); // returns true
        System.out.println(Objects.equal("a", "a")); // returns true
        System.out.println(Objects.equal(null, "a")); // returns false
        System.out.println(Objects.equal("a", null)); // returns false
        System.out.println(Objects.equal(null, null)); // returns true
        //MoreObjects.toStringHelper可以轻松编写有用的toString方法
        System.out.println(MoreObjects.toStringHelper(this)
                .add("x", 1)
                .add("y", false)
                .addValue("no")
                .toString());//GuavaTest1{x=1, y=false, no}

        //ComparisonChain替换比较器功能,懒比较:它执行比较操作直至发现非零的结果,在那之后的比较输入将被忽略。
        UserTest u1 = new UserTest("a", 1);
        UserTest u2 = new UserTest("b", 2);
        UserTest u3 = new UserTest("a", 2);
        System.out.println(u1.compareTo(u2));
        System.out.println(u2.compareTo(u3));
    }

    /***
     * 排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。
     * 从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。
     *
     *  创建排序器:常见的排序器可以由下面的静态方法创建:
     *  方法                  描述
     *  natural()            对可排序类型做自然排序,如数字按大小,日期按先后排序
     *  usingToString()      按对象的字符串形式做字典排序[lexicographical ordering]
     *  arbitrary()          返回一个所有对象的任意顺序, 即compare(a, b) == 0 就是 a == b (identity equality)。 本身的排序是没有任何含义, 但是在VM的生命周期是一个常量。
     *  from(Comparator)     把给定的Comparator转化为排序器
     *
     *  链式调用方法:通过链式调用,可以由给定的排序器衍生出其它排序器:
     *  方法	                    描述
     *  reverse()               获取语义相反的排序器
     *  nullsFirst()            使用当前排序器,但额外把null值排到最前面。
     *  nullsLast()             使用当前排序器,但额外把null值排到最后面。
     *  compound(Comparator)    合成另一个比较器,以处理当前排序器中的相等情况。
     *  lexicographical()       基于处理类型T的排序器,返回该类型的可迭代对象Iterable的排序器。
     *  onResultOf(Function)    对集合中元素调用Function,再按返回值用当前排序器排序。
     *
     *  运用排序器:Guava的排序器实现有若干操纵集合或元素值的方法
     *  方法                                   描述  另                                                                 请参见
     *  greatestOf(Iterable iterable, int k)  获取可迭代对象中最大的k个元素。                                              leastOf
     *  isOrdered(Iterable)                   判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。                      isStrictlyOrdered
     *  sortedCopy(Iterable)                  判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素。                   immutableSortedCopy
     *  min(E, E)                             返回两个参数中最小的那个。如果相等,则返回第一个参数。                          max(E, E)
     *  min(E, E, E, E...)                    返回多个参数中最小的那个。如果有超过一个参数都最小,则返回第一个最小的参数。       max(E, E, E, E...)
     *  min(Iterable)                         返回迭代器中最小的元素。如果可迭代对象中没有元素,则抛出NoSuchElementException。 max(Iterable), min(Iterator), max(Iterator)
     *
     * reverse():                            返回与当前Ordering相反的排序:
     * nullsFirst():                         返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
     * nullsLast():                         返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
     * compound(Comparator):                返回一个使用Comparator的Ordering,Comparator作为第二排序元素,例如对bug列表进行排序,先根据bug的级别,再根据优先级进行排序;
     * lexicographical():                   返回一个按照字典元素迭代的Ordering;
     * onResultOf(Function):                将function应用在各个元素上之后, 在使用原始ordering进行排序;
     * greatestOf(Iterable iterable, int k):返回指定的第k个可迭代的最大的元素,按照这个从最大到最小的顺序。是不稳定的。
     * leastOf(Iterable iterable, int k):返回指定的第k个可迭代的最小的元素,按照这个从最小到最大的顺序。是不稳定的。
     * isOrdered(Iterable):                 是否有序,Iterable不能少于2个元素。
     * isStrictlyOrdered(Iterable):         是否严格有序。请注意,Iterable不能少于两个元素。
     * sortedCopy(Iterable):                返回指定的元素作为一个列表的排序副本。
     */
    public void test1_4(){
        List list = Lists.newArrayList();
        list.add("peida");
        list.add("jerry");
        list.add("harry");
        list.add("eva");
        list.add("jhon");
        list.add("neron");
        System.out.println("list:"+ list);

        Ordering naturalOrdering = Ordering.natural();
        Ordering usingToStringOrdering = Ordering.usingToString();
        Ordering arbitraryOrdering = Ordering.arbitrary();

        System.out.println("sortedCopy1:"+ naturalOrdering.sortedCopy(list));
        System.out.println("sortedCopy2:"+ usingToStringOrdering.sortedCopy(list));
        System.out.println("sortedCopy3:"+ arbitraryOrdering.sortedCopy(list));

        System.out.println("reverse:" + naturalOrdering.reverse().sortedCopy(list));
        list.add(null);
        System.out.println("nullsFirst:" + naturalOrdering.nullsFirst().sortedCopy(list));
        System.out.println("nullsLast:" + naturalOrdering.nullsLast().sortedCopy(list));
        list.remove(null);
        System.out.println("compound:" + arbitraryOrdering.compound(naturalOrdering).sortedCopy(list));
        System.out.println("lexicographical:" + naturalOrdering.lexicographical().natural().sortedCopy(list));
        com.google.common.base.Function add = str -> str.replace("e","z");
        System.out.println("onResultOf:" + naturalOrdering.onResultOf(add).sortedCopy(list));
        System.out.println("greatestOf:" + naturalOrdering.greatestOf(list, 2));
        System.out.println("leastOf:" + naturalOrdering.leastOf(list, 2));

        List list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        list2.add(3);
        Ordering naturalIntegerOrdering = Ordering.natural();
        System.out.println("leastOf:" + naturalIntegerOrdering.isOrdered(list2));
        System.out.println("isStrictlyOrdered:" + naturalIntegerOrdering.isStrictlyOrdered(list2));
    }

    /**
     * RuntimeException propagate(Throwable)                                       如果Throwable是Error或RuntimeException,直接抛出;否则把Throwable包装成RuntimeException抛出。返回类型是RuntimeException,所以你可以像上面说的那样写成throw Throwables.propagate(t),Java编译器会意识到这行代码保证抛出异常。
     * void propagateIfInstanceOf(Throwable, Class) throws X  Throwable类型为X才抛出
     * void propagateIfPossible(Throwable)                                         Throwable类型为Error或RuntimeException才抛出
     * void propagateIfPossible(Throwable, Class) throws X    Throwable类型为X, Error或RuntimeException才抛出
     */
    public void test1_5() {
        //略,不建议使用
    }

    public static class UserTest{
        private String name;
        private Integer age;

        public UserTest() {
        }

        public UserTest(String name) {
            this.name = name;
        }

        public UserTest(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
        public int compareTo(UserTest that) {
            return ComparisonChain.start()
                    .compare(name.length(), that.name.length())
                    .compare(age, that.age)
                    .compare(age, that.age, Ordering.natural().nullsLast())
                    .result();
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }
    }
}
 
  





你可能感兴趣的:(guava)