Guava工具集

2020-08-04  本文已影响0人  寂静的春天1988
使用和避免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
上一篇 下一篇

猜你喜欢

热点阅读