• guava笔记


      ​guava是在原先google-collection 的基础上发展过来的,是一个比较优秀的外部开源包,最近项目中使用的比较多,列举一些点。刚刚接触就被guava吸引了。。。

        ​    ​这个是guava的一个官网ppt里面的介绍:

    1
    2
    3
    4
    5
    其实你可能发现,一些基本的校验完全可以自己写,但是。。
    这些东西仅仅是看起来比较简单,实际上可能比我们想想的要复杂;
    用一个公共的lib,别人可能更加容易理解你的代码;
    当你用一个主流的开源包的时候,你可能在主流中;
    当你发现一个可以提升的点的 时候,如果仅仅是修改自己的私有包,可能没有多少人能够受益;

    1、非空检查,参数在赋值的时候就做一个检查

    1
    2
    String inputName = "iamzhongyong";
    String name = Preconditions.checkNotNull(inputName);

    这个减少了代码行数,认为变量必须赋值才可以使用。

    多条件校验

    1
    2
    String inputName = "iamzhongyong";
    Preconditions.checkArgument(inputName!=null && !"".equals(inputName),"input is null");

    能够有效的减少代码行数

    此外Preconditions中还有多个校验方法,可以优雅的进行判断了。

    2、优雅的使用null

    空指针异常是我们再写代码的时候经常遇到的,guava提供了Optional来让你不得不思考null的问题

    Optional.of(T):获得一个Optional对象,其内部包含了一个非null的T数据类型实例,若T=null,则立刻报错。

    Optional.absent():获得一个Optional对象,其内部包含了空值,内部代码看,是返回了Absent的一个实例。

    Optional.fromNullable(T):将一个T的实例转换为Optional对象,T的实例可以不为空,也可以为空[Optional.fromNullable(null),和Optional.absent()等价。

    1
    2
    3
    4
    Optional<String> name = Optional.of("iamzhongyong");
            if(name.isPresent()){
                System.out.println(name.get());
            }

    3、Object中常用的方法

    例如我们常见的equals方法和hashCode方法,Objects中都有与之对应的方法提供;

    同时,toString是我们比较常用的,Objects.toStringHelper方法十分方便

    1
    2
    3
    4
    5
    6
    7
    8
    public class StringHelp {
        public String name;
        public int age;
        @Override
        public String toString() {
            return Objects.toStringHelper(this).add("name"this.name).add("age"this.age).toString();
        }
    }

    4、字符转链接(Joiner 类)

    1
    2
    3
    4
    5
    6
    7
    8
    public static void main(String[] args) {
            List<String> names = Lists.newArrayList();
            names.add("iamzhongyong");
            names.add("bixiao.zy");
            StringBuilder sb = new StringBuilder();
            String rs = Joiner.on("--").appendTo(sb, names).toString();
            System.out.println(rs);
        }

    5、字符串分隔符

    这个时候你可能说JDK自己有分割器,但是其实guava这个更加灵活,其实JDK的那个性能不咋滴

    1
    2
    3
    4
    5
    6
    public static void main(String[] args) {
            String s = "dd  sfsfs  , dsfsf,ssfdfsdffsdfsf.sdfsfs,msfds";
            for(String name : Splitter.on(",").trimResults().split(s)){
                System.out.println(name);
            }
        }

    6、不可变的集合(Immutable)

    这里就拿一个map为例子,初始化一个集合,然后向里面放置几个不变的集合

    1
    2
    3
    Map<Integer,String> mapa = new HashMap<Integer,String>();
            mapa.put(122"iamzhongyong");
            mapa.put(1222"bixiao.zy");

    现在用Immutable就可以很简单的完成了

    1
    2
    ImmutableMap<Integer, String> map = ImmutableMap.of(122,"iamzhongyong",1222,"bixiao.zy");
            System.out.println(map.toString());

    7、一个key对应多个Valve的情况

    我们经常遇到这种,一个key有多个value的情况,一般的做法如下:Map<Key,List<Value>>的数据结构去搞,

    但是现在又办法了,可以使用Multimap来解决这个问题,简洁明了

    1
    2
    3
    4
    5
    Multimap<Integer, String> keyValues = ArrayListMultimap.create();
            keyValues.put(1"a");
            keyValues.put(1"b");
            keyValues.put(2"c");
            System.out.println(keyValues.toString());

    8、本地缓存

    guava的缓存设计的比较巧妙,这里就简单介绍一下,guava的缓存创建分为两种,一种是CacheLoader的方式,一种是callback的方式

    参数的话就不多介绍了,直接在CacheBuilder中可以看到,类似这个

    1
    2
    3
    4
    5
    CacheBuilder.newBuilder()
                .maximumSize(10)
                .initialCapacity(3)
                .expireAfterWrite(10, TimeUnit.SECONDS)
                .build();

    下面这个例子是callback的形式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public void getNameFromLocalCache() throws Exception{
            //new一个cache的对象出来
            Cache<String/*name*/,String/*nick*/> cache = CacheBuilder.newBuilder().maximumSize(10).build();
            //在get的时候,如果缓存里面没有,则通过实现一个callback的方法去获取
            String name = cache.get("bixiao"new Callable<String>() {
                public String call() throws Exception {
                    return "bixiao.zy"+"-"+"iamzhongyong";
                }
            });
            System.out.println(name);
            System.out.println(cache.toString());
        }

    下面这个例子是LoadingCache的

    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
    public void getNameLoadingCache(String name) throws Exception{
            LoadingCache<String, String> cache = CacheBuilder.newBuilder()
                //设置大小,条目数
                .maximumSize(20)
                //设置失效时间,创建时间
                .expireAfterWrite(20, TimeUnit.SECONDS)
                //设置时效时间,最后一次被访问
                .expireAfterAccess(20, TimeUnit.HOURS)
                //移除缓存的监听器
                .removalListener(new RemovalListener<String, String>() {
                    public void onRemoval(RemovalNotification<String, String> notification) {
                        System.out.println("有缓存数据被移除了");
                    }})
                //缓存构建的回调
                .build(new CacheLoader<String, String>(){//加载缓存
                    @Override
                    public String load(String key) throws Exception {
                        return key + "-" "iamzhongyong";
                    }
            });
     
            System.out.println(cache.get(name));
            cache.invalidateAll();
        }
        

    9、集合 并集、交集、补集的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        HashSet setA = Sets.newHashSet(12345); 
        HashSet setB = Sets.newHashSet(45678); 
            
        SetView union = Sets.union(setA, setB); 
        System.out.println(union);
            
        SetView difference = Sets.difference(setA, setB); 
        System.out.println(difference);  
            
        SetView intersection = Sets.intersection(setA, setB); 
        System.out.println(intersection);

    这些仅仅是一个开始

  • 相关阅读:
    Java并发教程(Oracle官方资料)
    java中的字符集和编码
    一篇文章看懂Java并发和线程安全
    mysql中,如何查看数据库中当前可用的校勘?字符集默认的collation?
    mysql数据库中,查看当前支持的字符集有哪些?字符集默认的collation的名字?
    mysql数据库中,通过一条insert into语句,同时插入多个值
    jenkins第一次登陆,输入完密码之后,卡在了SetupWizard[jenkins]处
    mysql数据库,如何在登录mysql之后执行操作系统上的SQL脚本?
    mysql在命令行中,指定要连接的数据库?
    mysql中如何在命令行中,执行一个SQL脚本文件?
  • 原文地址:https://www.cnblogs.com/huangwentian/p/6959068.html
Copyright © 2020-2023  润新知