Guava自学习笔记一

偶然的机会接触guava,对于我这种小白来说,google的东西当然是高大上的了,所以抱着学(装)习(逼)的心态,在网上向前辈们学习了下。当然,我学guava主要也就几个目的,首先当然是想着能否把guava应用在自己平日的代码里,如果guava的引用能使代码的书写更加简洁优雅,更着提升程序的性能,减少难以预测的错误,当然是极好的。当然,俺们的目的肯定不限于此,当能很好的应用于项目了,忘了说了,guava应该就是一个工具类集合了,里面对很多我们平常用的对象,方法进行了简单的封装,而使得通过调用guava里扩展的方法比调用java原生的方法要更优雅而严谨,从这方面来说这个封装应该不会太简单。鉴于此,guava学习的终极目标应该是通过源码的分析来学习它牛逼的思想了。(写到此,已经一头雾水)

张三跟李四说让他去找王五的媳妇过来,先不管找隔壁老王媳妇的目的是什么,如果隔壁老王搬走了,当然应该是东窗事发,赶夜路走的,那这个时候老王都找不到了,又怎么找他媳妇呢。这要在程序里也好理解,就空指针异常嘛。也没多大的事,但你这样莫名其妙的空指针不是不优雅,你说没办法,老王不在家。好吧,现在给每户人家配个职岗管家,你就去问管家,人在不在管家一概都知道,这样他就不会莫名其妙的吐你一口空指针了。那guava就有这样的管家免费到货。

这个管家是谁呢,对,就是Optional 。

Optional给null分配了个管家,现在你想要个空对象,只要

Optional<Integer> NullableOpt=Optional.fromNullable(null);

下就好了,这样NullableOpt这个对象就管着一个原本空指针的对象了,现在这样NullableOpt.isPresent()调用这个方法返回的是这个对象是否是空的判断,返回boolean,不为空就是true.当然你大概不会存个null进去。一般的你会有一个变量 比如a,然后你

Optional<Integer> aOpt=Optional.fromNullable(a);

这样你就可以这样if(aOpt.isPresent()){}判断是否为空了,如果不为空的话那怎样取得这个管家管理的那个对象的值呢。get对。

possible.get()就像这样,便能取的所管辖的具体值了。这些你可能不会了,这个值都还没存进去呢,当然,之前这个值是应该要存进去的,那也是很方便的。有两种方法存具体值

Optional<Integer> possible=Optional.of(6);直接存值,如果存了null,运行时报空指针

Optional<Integer> NoNullableOpt=Optional.fromNullable(10);另外这是第二种方法,你会发现这个fromNullable既可以存null,也可以存具体对象,so就是这么酷炫。当然如果你的确要取一个空,Optional也有一个专职方法任你调戏

Optional.absent()返回的对象,的isPresent()的方法比如false,也就是管家明确的告诉你老王没了。跑了。。

在悄悄的告诉你两个方法

例如

Optional<Integer> NullableOpt=Optional.fromNullable(null);这个

你可以通过asSet方法

Set<Integer> set=NullableOpt.asSet();得到一个Set,当然这个Set的size()为1

另外,现在你有个这的毛病,你要看看里面那个值是不是你本来的那个值,像这样

Optional<Integer> bOpt=Optional.fromNullable(12);你放了个12,然后你忘了,你说你咋会忘

好,忘了没事,咱死马当活马,bOpt.or(8)这样要是果真是现在的8,就给你返回原本存进去的那个8,这明显不是啊,没关系,死马当活马么,就拿你传进来的这个8充充数,你知我知,就好了。呵呵。。

开始我们要得到这个存在里面的值是不是得先isPresent()判断下,这样是不是不爽,没事,还有一招

bOpen.orNull();高手都是不变应万变的,这样要是存的是null就返回null要是是某个具体对象或值什么的,就原本那个给他了

今天班会,开到这里,散会。滚蛋儿~~

等等,留个小代码~~

  

package com.test;

import java.util.Set;

import org.junit.Test;

import com.google.common.base.Optional;

public class OptionalTest {

    @Test
    public void testOptional() throws Exception {
        Optional<Integer> possible=Optional.of(6);
        Optional<Integer> absentOpt=Optional.absent();
        Optional<Integer> NullableOpt=Optional.fromNullable(null);
        Optional<Integer> NoNullableOpt=Optional.fromNullable(10);
        if(possible.isPresent()){
            System.out.println("possible isPresent:"+possible.isPresent());
            System.out.println("possible value:"+possible.get());
        }
        if(absentOpt.isPresent()){
            System.out.println("absentOpt isPresent:"+absentOpt.isPresent()); ;
        }

        System.out.println("fromNullableOpt isPresent:"+NullableOpt.isPresent()); ;
        if(NoNullableOpt.isPresent()){
            System.out.println("NoNullableOpt isPresent:"+NoNullableOpt.isPresent()); ;
        }
    }

    @Test
    public void testMethodReturn() {
        Optional<Long> value = method();
        if(value.isPresent()==true){
            System.out.println("获得返回值: " + value.get());
        }else{

            System.out.println("获得返回值: " + value.or(-12L));
        }

        System.out.println("获得返回值 orNull: " + value.orNull());

        Optional<Long> valueNoNull = methodNoNull();
        if(valueNoNull.isPresent()==true){
            Set<Long> set=valueNoNull.asSet();
            System.out.println("获得返回值 set 的 size : " + set.size());
            System.out.println("获得返回值: " + valueNoNull.get());
        }else{
            System.out.println("获得返回值: " + valueNoNull.or(-12L));
        }

        System.out.println("获得返回值 orNull: " + valueNoNull.orNull());
    }

    private Optional<Long> method() {
        return Optional.fromNullable(null);
    }
    private Optional<Long> methodNoNull() {
        return Optional.fromNullable(15L);
    }
}

  

时间: 2024-10-03 23:28:11

Guava自学习笔记一的相关文章

Guava学习笔记:Google Guava 类库简介

> Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libraries, common annotations, string processing, I/O, 等等. 这些高质量的 API 可以使你的JAVa代码更加优雅,更加简洁,让你工作更加轻松愉悦.下面我们就开启优雅Java编程学习之旅! 项目相关信息: 官方首页:http://code.googl

Guava学习笔记:Multimaps

Guava学习笔记:Multimaps 有时候我们需要这样的数据类型Map<String,Collection<String>>,guava中的Multimap就是为了解决这类问题的. Multimap的实现 Multimap提供了丰富的实现,所以你可以用它来替代程序里的Map<K, Collection<V>>,具体的实现如下: 实现 Key实现 Value实现 ArrayListMultimap HashMap ArrayList HashMultima

Guava学习笔记:guava中的Preconditions使用

Guava学习笔记:guava中的Preconditions使用 转载:http://outofmemory.cn/java/guava/base/Preconditions google guava的base包中提供的Preconditions类用来方便的做参数的校验,他主要提供如下方法: checkArgument 接受一个boolean类型的参数和一个可选的errorMsg参数,这个方法用来判断参数是否符合某种条件,符合什么条件google guava不关心,在不符合条件时会抛出Illeg

Guava学习笔记: guava集合之Multiset

Guava学习笔记: guava集合之Multiset Multiset是什么? Multiset看似是一个Set,但是实质上它不是一个Set,它没有继承Set接口,它继承的是Collection<E>接口,你可以向Multiset中添加重复的元素,Multiset会对添加的元素做一个计数. 它本质上是一个Set加一个元素计数器. Multiset使用示例: package cn.outofmemory.guava.collection; import com.google.common.ba

Guava学习笔记: BiMap

Guava学习笔记: BiMap 我们知道Map是一种键值对映射,这个映射是键到值的映射,而BiMap首先也是一种Map,他的特别之处在于,既提供键到值的映射,也提供值到键的映射,所以它是双向Map. 想象这么一个场景,我们需要做一个星期几的中英文表示的相互映射,例如Monday对应的中文表示是星期一,同样星期一对应的英文表示是Monday.这是一个绝好的使用BiMap的场景. package cn.outofmemory.guava.collection; import com.google.

Guava学习笔记:guava中对字符串的操作

Guava学习笔记:guava中对字符串的操作 转载:http://outofmemory.cn/java/guava/base/Strings 在google guava中为字符串操作提供了很大的便利,有老牌的判断字符串是否为空字符串或者为null,用指定字符填充字符串,以及拆分合并字符串,字符串匹配的判断等等. 下面我们逐一了解这些操作: 1. 使用com.google.common.base.Strings类的isNullOrEmpty(input)方法判断字符串是否为空        

Guava学习笔记:guava的不可变集合

Guava学习笔记:guava的不可变集合 不可变集合的意义 不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的: 不可变对象被多个线程调用时,不存在竞态条件问题 不可变集合不需要考虑变化,因此可以节省时间和空间.所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节): 不可变对象因为有固定不变,可以作为常量来安全使用. 创建对象的不可变拷贝是一项很好的防御性编程技巧.Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本. 

Guava学习笔记: guava中的对象封装操作

Guava学习笔记: guava中的对象封装操作 转载:http://outofmemory.cn/java/guava/base/Objects 我们在开发中经常会需要比较两个对象是否相等,这时候我们需要考虑比较的两个对象是否为null,然后再调用equals方法来比较是否相等,google guava库的com.google.common.base.Objects类提供了一个静态方法equals可以避免我们自己做是否为空的判断,示例如下:         Object a = null;  

Guava学习笔记:guava Throwables帮你处理异常,抛出异常

Guava学习笔记:guava Throwables帮你处理异常,抛出异常 guava类库中的Throwables提供了一些异常处理的静态方法,这些方法的从功能上分为两类,一类是帮你抛出异常,另外一类是帮你处理异常. 也许你会想:为什么要帮我们处理异常呢?我们自己不会抛出异常吗? 假定下面的方法是我们要调用的方法.     public void doSomething() throws Throwable {         //ignore method body     }     pub