Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。使用guava可以让你的java代码更加的规范。具体使用:

Java repository 已经有了 报NOsuchfile_Test

如上图所示,如果报错,可以在maven中使用更早版本的guava包(错误意思是使用了1.8版本编译但是不能用其他版本运行)

一、基本使用

1、使用和避免null
Optional.of(T):创建指定引用的Optional实例,若引用为null则快速失败;
Optional.absent():创建引用缺失的Optional实例;
Optional.fromNullable(T):创建指定引用的Optional实例,若引用为null则表示缺失;
boolean isPresent():如果Optional包含非null的引用(引用存在),返回true;
T get():返回Optional所包含的引用,若引用缺失,则抛出java.lang.IllegalStateException;

@Test
    public void optionalTest(){
        Person p1 = new Person("周杰伦",37);
        Person p2 = null;
        Optional<Person> optPer1 =  Optional.of(p1);
        //Optional<Person> optPer2 =  Optional.of(p2);//报空指针异常
        Optional<Person> optPer2 = Optional.fromNullable(p2);//可以放空值
        System.out.println(optPer1.get().getName());
        //System.out.println(optPer2.get());//如果p2是空,使用formNullable,调用get则报java.lang.IllegalStateException: Optional.get() cannot be called on an absent value
        System.out.println(optPer1.isPresent());//有值返回true
    }

2、前置条件(让方法调用的前置条件判断更简单)
checkArgument(i >= 0, “Argument was %s but expected nonnegative”, i);
checkNotNull(T)等方法;

@Test
    public void testPreconditions(){
        // 不会输出任何代码
        String str = "abc";
        Preconditions.checkNotNull(str,"str 为 null");

        //报java.lang.NullPointerException:constantName 为 null
        String constantName = null;
        Preconditions.checkNotNull(constantName,"constantName 为 null");

    }

二、集合的使用

FluentIterable 是guava集合类中常用的一个类,主要用于过滤、转换集合中的数据;FluentIterable 是一个抽象类,实现了Iterable接口,大多数方法都返回FluentIterable对象,这也是guava的思想之一。

return FluentIterable.from(results).transform(toPlanMinInvestAmountDTO()).toList();

private Function<Object[], PlanMinInvestAmountDTO> toPlanMinInvestAmountDTO() {
        return new Function<Object[], PlanMinInvestAmountDTO>() {
            @Override
            public PlanMinInvestAmountDTO apply(Object[] input) {
                return aPlanMinInvestAmountDTO()
                        .withMinInvestAmount((BigDecimal) input[0])
                        .withPlanType((String) input[1])
                        .build();
            }
        };
    }

 //测试过滤掉50岁以上的人
    @Test
    public void testFilter(){
        Person p1 = new Person("周杰伦",37);
        Person p2 = new Person("王力宏",43);
        Person p3 = new Person("李易峰",23);
        Person p4 = new Person("许镜清",70);
        Person p5 = new Person("贝多芬",72);
        List<Person> persons = asList(p1, p2, p3,p4,p5);
        List<Person> persons1 = from(persons).filter(getPersomAgeUnder30()).toList();
        for(Person p:persons1){
            System.out.println(p.getName()+"  "+p.getAge());
        }
    }

    //过滤大于50岁的,返回true则获取该条数据到返回list中
    private Predicate<Person> getPersomAgeUnder30() {
        return new Predicate<Person>() {
            public boolean apply(Person input) {
                return input.age < 50;
            }
        };
    }

三、函数式编程

过度使用Guava函数式编程会导致冗长、混乱、可读性差而且低效的代码。如上方法toPlanMinInvestAmountDTO

四、字符串处理:分割,连接

@Test
    public void stringGuava(){
        //连接器
        Joiner joiner = Joiner.on(";").skipNulls();//如果不加skipNulls,参数中有null将会报空指针
        System.out.println(joiner.join("Harry", null, "Ron", "Hermione"));//输出Harry;Ron;Hermione

        Joiner joiner2 = Joiner.on(";").useForNull("****");//代替null值
        System.out.println(joiner2.join("Harry", null, "Ron", "Hermione"));//输出Harry;****;Ron;Hermione

        //拆分器
        String str = ",a,,b,";
        String[] strArr = str.split(",");
        System.out.println(strArr.length);//输出4
        for(String s:strArr){
            System.out.println(s==null? "NULL":s);//输出"",a,"",b,只有尾部的空字符串被忽略
        }
        System.out.println("----------");
        //omitEmptyStrings():从结果中自动忽略空字符串
        //trimResults() :移除结果字符串的前导空白和尾部空白
        //trimResults(CharMatcher):给定匹配器,移除结果字符串的前导匹配字符和尾部匹配字符
        Iterable<String> strs = Splitter.on(",").trimResults().omitEmptyStrings().split(str);
        for(String s:strs){
            System.out.println(s);//只输出a,b
        }
        //如果你想要拆分器返回List,只要使用Lists.newArrayList(splitter.split(string))或类似方法
    }