Guava学习笔记

一、导入Guava

在pom.xml 中加入依赖

<dependency>
      <groupId>com.google.guava</groupId>
      <artifactId>guava</artifactId>
      <version>20.0</version>
</dependency>

二、Ordering的用法

@SpringBootTest
public class OrderingTest {


    @Test
    public void OrderingTest_NotNULL(){
        List<String> list = Lists.newArrayList();

        list.add("apple");
        list.add("hurry");
        list.add("banana");
        list.add("banner");
        list.add("fdsfg");

        //natural():使用Comparable类型的自然顺序, 例如:整数从小到大,字符串是按字典顺序;
        Ordering<String> orderingByNatural = Ordering.natural();
        //reverse(): 返回与当前Ordering相反的排序:
        Ordering<String> orderingByReverse = Ordering.natural().reverse();
        // usingToString() :使用toString()返回的字符串按字典顺序进行排序;
        Ordering<Object> orderingByUsingToStr = Ordering.usingToString();
        // arbitrary() :返回一个所有对象的任意顺序,
        Ordering<Object> orderingByarbitrary = Ordering.arbitrary();

        System.out.println("natural:"+orderingByNatural.sortedCopy(list));
        System.out.println("natural Reverse :"+orderingByReverse.sortedCopy(list));
        System.out.println("orderingByUsingToStr:"+orderingByUsingToStr.sortedCopy(list));
        System.out.println("arbitraryOrdering:"+ orderingByarbitrary.sortedCopy(list));
    }

    @Test
    public void OrderingTest_NULL(){
        List<String> list = Lists.newArrayList();

        list.add("apple");
        list.add("hurry");
        list.add("banana");
        list.add("banner");
        list.add(null);

        //返回一个将null放在non-null元素之前的Ordering,其他的和原始的Ordering一样;
        Ordering<String> orderingByNatural = Ordering.natural().nullsFirst();
        //返回一个将null放在non-null元素之后的Ordering,其他的和原始的Ordering一样;
        Ordering<Object> orderingByUsingToStr = Ordering.usingToString().nullsLast();

        System.out.println("natural:"+orderingByNatural.sortedCopy(list));
        System.out.println("orderingByUsingToStr:"+orderingByUsingToStr.sortedCopy(list));
    }
}

三、新集合的用法

1、Multiset
Guava提供了一个新集合类型 Multiset,它可以多次添加相等的元素。可以用Multiset跟踪每种对象的数量,所以你可以用来进行数字统计。(传统方法用Map进行统计,效率低下)。

Multiset接口定义的接口主要有:
    add(E element) :向其中添加单个元素
    add(E element,int occurrences) : 向其中添加指定个数的元素
    count(Object element) : 返回给定参数元素的个数
    remove(E element) : 移除一个元素,其count值会对应减少
    remove(E element,int occurrences): 移除相应个数的元素
    elementSet() : 将不同的元素放入一个Set中
    entrySet(): 类似与Map.entrySet 返回Set<Multiset.Entry>。包含的Entry支持使用getElement()和getCount()
    setCount(E element ,int count): 设定某一个元素的重复次数
    setCount(E element,int oldCount,int newCount): 将符合原有重复个数的元素修改为新的重复次数
    retainAll(Collection c) : 保留出现在给定集合参数的所有的元素
    removeAll(Collectionc) : 去除出现给给定集合参数的所有的元素

/**
     * Multiset有一个有用的功能,就是跟踪每种对象的数量,所以你可以用来进行数字统计
     * 记录字符串在数组中出现的次数
     */
    public void MultiSetTest(){
        String strWorld="wer|dfd|dd|dfd|dda|de|dr";
        String[] words=strWorld.split("\\|");
        List<String> wordList=new ArrayList<String>();

        for(String word : words){
            wordList.add(word);
        }

        Multiset<String> multiSet = HashMultiset.create();
        multiSet.addAll(wordList);

        for(String key:multiSet.elementSet()){
            System.out.println(key+" count:"+multiSet.count(key));
        }

        //multiset.size() 方法返回的是所有的元素的总和,相当于是将所有重复的个数相加。
        System.out.println("size = "+multiSet.size());
        //如果需要知道每个元素的个数可以使用elementSet().size()得到.
        System.out.println("不同元素个数="+multiSet.elementSet().size());

    }

运行结果如下:
在这里插入图片描述

2、Multimap
可以替代 Map<String,List> 的一种集合类型。

multimap可以把键映射到任意多个值。

multimap一般使用其实现的接口,如ListMultimap或SetMultimap接口。

multimap的方法主要有:

put(K,V)

putAll(K, Iterable<>)

remove(K,V)

removeAll(K)

get(K)

values() :返回值的集合形式

size()

asMap():为Multimap<K, V>提供Map<K,Collection>形式的视图。返回的Map支持remove操作,并且会反映到底层的Multimap,但它不支持put或putAll操作。

entries(): 用Collection<Map.Entry<K, V>>返回Multimap中所有”键-单个值映射”——包括重复键。(对SetMultimap,返回的是Set)

/**
     * Multimap是把键映射到任意多个值的一般方式。
     */
    public void MultiMapTest(){

        Multimap<String,String> multimap = ArrayListMultimap.create();
        // Adding some key/value
        multimap.put("Fruits", "Bannana");
        multimap.put("Fruits", "Apple");
        multimap.put("Fruits", "Pear");
        multimap.put("Fruits", "Pear");
        multimap.put("Vegetables", "Carrot");

        //size()获取元素个数
        System.out.println("size="+multimap.size());

        //获取元素
        System.out.println("fruits = "+multimap.get("Fruits"));


        // 遍历获取值
        for (String value : multimap.values()) {
            System.out.println(value);
        }

        //移除
        multimap.remove("Fruits","Pear");
        System.out.println("fruits = "+multimap.get("Fruits"));


        //移除所有
        multimap.removeAll("Fruits");
        System.out.println("fruits = "+multimap.get("Fruits"));
    }

结果:
在这里插入图片描述
3、Table
Table有如下几种实现:

HashBasedTable:本质上用HashMap<R, HashMap<C, V>>实现;

TreeBasedTable:本质上用TreeMap<R, TreeMap<C,V>>实现;

ImmutableTable:本质上用ImmutableMap<R, ImmutableMap<C, V>>实现;注:ImmutableTable对稀疏或密集的数据集都有优化。

ArrayTable:要求在构造时就指定行和列的大小,本质上由一个二维数组实现,以提升访问速度和密集。

四、split
Java自带的split带正则式,效率较低,可以考虑使用Guava的guava工具

  String str1="a,b,c,d,,f,g"; 
  //可以考虑使用apache的StringUtils.split(string,char)
  List<String> list = Arrays.asList(StringUtils.split(str1, ","));
  //可以考虑guava工具
  List<String> list1=Splitter.on(",").splitToList(str1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值