美文网首页
Guava工具集

Guava工具集

作者: 寂静的春天1988 | 来源:发表于2020-08-04 11:03 被阅读0次
使用和避免null

1、创建Optional对象

1)创建一个空的Optional:Optional.empty()
2)创建一个不为空的Optional,如果为空立马抛出异常:Optional.of("xxx");
3)创建一个任意的Optional,可以为null,也可以不为null:Optional.ofNullable(null)

2、判断引用是否缺失(是否为null)
optional1.isPresent()//不建议使用
optional1.ifPresent(System.out::print);//当引用存在时执行

    @Test
    public void test() {
        //创建Optional对象
        Optional<String> optional1=Optional.ofNullable("123");
        String a1=optional1.orElse(getDefaultValue());
        System.out.println("a1="+a1);
        String a2=optional1.orElseGet(()->{return getDefaultValue();
        });
        System.out.println("a2="+a2);
        optional1.orElseThrow(()->{
            throw new RuntimeException("引用缺失");
        });
        optional1.ifPresent(System.out::print);
    }
    
    public String getDefaultValue(){  //远程方法调用
        System.out.println("我被调用了!");
        return "我是默认值";
    }

orElse和orElseGet的区别:orElse一定会去执行方法,但是不拿返回值,orElseGet引用为null时才去执行方法,一般使用orElseGet。

引用缺失时抛出异常

        optional1.orElseThrow(()->{
            throw new RuntimeException("引用缺失");
        });

举个例子:如何使用op避免空指针

    @Test
    public void testMap(){  
        List<String> strList=null;
        strList.stream().forEach(System.out::println);
    }
    @Test
    public void testMap1(){  
        List<String> strList=null;
        Optional.ofNullable(strList)
                .map(List::stream)
                .orElseGet(Stream::empty)
                .forEach(System.out::println);
    }

.map(List::stream)如果引用不为空就执行方法,将list变成stream。如果为空就返回一个Optional
.orElseGet(Stream::empty)如果引用为空,创建一个空的stream

以上代码就巧妙的避免了list的空指针异常。

不可变集合

1、首先jdk为了提供了产生不可变集合的方法

    @Test
    public void test() {
        ArrayList<Integer> list=new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        List<Integer> newlist = Collections.unmodifiableList(list);
        newlist.remove(0);
        System.out.println(list);
    }

2、guava方式

    @Test
    public void test1() {
        ArrayList<Integer> list=new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        // 通过已存在的集合创建
        ImmutableSet immutableSet=ImmutableSet.copyOf(list);
        
        // 通过初始值创建
        ImmutableSet immutableSet1=ImmutableSet.of(1, 2);
        
        // 以bulider方式创建
        ImmutableSet immutableSet2=ImmutableSet.builder()
                                            .add(1)
                                            .addAll(Sets.newHashSet(2,3))
                                            .add(4)
                                            .build();
        
    }

新集合类型

image.png

Multiset


image.png

Multiset:
与list相关的特点:没有元素顺序限制的ArrayList
与Map相关的特点:Map<E,Integer>,键为元素,值为计数
count(Object):返回给定元素的计数
entrySet():返回Set<Mulitset.Entry<E>>,和Map的entrySet类似
elementSet():返回所有不重复元素的Set<E>,和Map的keySet类似。

image.png

需求:统计一篇文章,文字出现的频率。

@Test
    public void test() {
        String text="南陵别儿童入京" + 
                "唐代:李白" + 
                "白酒新熟山中归,黄鸡啄黍秋正肥。" + 
                "呼童烹鸡酌白酒,儿女嬉笑牵人衣。" + 
                "高歌取醉欲自慰,起舞落日争光辉。" + 
                "游说万乘苦不早,著鞭跨马涉远道。" + 
                "会稽愚妇轻买臣,余亦辞家西入秦。" + 
                "仰天大笑出门去,我辈岂是蓬蒿人。";
    
        Multiset<Character> multiset=HashMultiset.create();
        char[] chars=text.toCharArray();
        Chars.asList(chars).stream().forEach(item->{
            multiset.add(item);
        });;
        System.out.println("size="+multiset.size());
        
        System.out.println(multiset.count('人'));
    }

集合工具类

1、使用Lists

    @Test
    public void test1() {
        List<Integer> list=Lists.newArrayList(1,2,3,4,5,6,7);
        // 将list拆分成3个一组
        List<List<Integer>> partition=Lists.partition(list, 3);
        System.out.println(JSON.toJSONString(partition));
        
        // 反转
        List<Integer> reverse=Lists.reverse(list);
        System.out.println(JSON.toJSONString(reverse));
    }

2、使用Sets

@Test
    public void test1() {
        Set set1=Sets.newHashSet(1,2,3);
        Set set2=Sets.newHashSet(4,5,6);
        
        // 并集
        Set<Integer> set=Sets.union(set1, set2);
        System.out.println(set);
    
        // 交集
        Set<Integer> set3=Sets.intersection(set1, set2);
        System.out.println(set3);
    
        // 差集:如果元素属于A,不属于B
        Set<Integer> set4=Sets.difference(set1, set2);
        System.out.println(set4);
        
        // 相对差集:如果元素属于A,不属于B 或者,属于B不属于A
        Set<Integer> set5=Sets.symmetricDifference(set1, set2);
        System.out.println(set5);
        
        // 拆解子集
        Set<Set<Integer>> set6=Sets.powerSet(set1);
        System.out.println(JSON.toJSONString(set6));
        
        // 计算两个集合的笛卡尔积
        Set<List<Integer>> set7=Sets.cartesianProduct(set1,set2);
        System.out.println(JSON.toJSONString(set7));

    }

IO

image.png image.png

相关文章

  • Guava工具集

    使用和避免null 1、创建Optional对象 1)创建一个空的Optional:Optional.empty(...

  • Guava 学习

    guava Splitter 学习 guava Sets 集合类取交集、差集、并集

  • Guava工具类

    Guava工具类 简介 Guava 是Google基于java1.6开发的工具扩展库。 主要包括: annotat...

  • Java开源工具类:Guava

    Guava 介绍 Guava 是一款 Google 开源工具类,包含许多 Google 内部 Java 项目依赖的...

  • 关于一些比较好用的工具类以及用之前与之后的差别

    java好用的工具收集 Guava Guava CharMatcher(由于版本的更新 许多方法做了些许变动 如果...

  • 限流工具RateLimter

    guava限流工具RateLimiter RateLimiter和java并发工具Semaphore不同的是,Ra...

  • 优雅编程 - Guava

    本篇采用示例的形式展示Guava的常见工具应用. Guava集合排序 示例代码 执行输出 示例代码 执行输出 Gu...

  • Guava | 基本工具

    一、使用和避免null 1、为什么要避免使用null呢? 2、使用null的正确场景 3、Guava给出的措施 4...

  • 基本工具(guava)

    1.1-使用和避免null 轻率地使用null可能会导致很多令人惊愕的问题。通过学习Google底层代码库,我们发...

  • [Guava] Google Guava 集合工具类

    Google Guava 集合工具类 Guava中的集合方法扩展 任何对JDK集合框架有经验的程序员都熟悉和喜欢j...

网友评论

      本文标题:Guava工具集

      本文链接:https://www.haomeiwen.com/subject/bsesrktx.html