• Guava包学习---Lists


      Guava包是我最近项目中同事推荐使用的,是google推出的库。里面的功能非常多,包括了集合、缓存、原生类型支持、并发库、通用注解、字符串处理、IO等。我们项目中使用到了guava依赖,但是实际上只是用了其中很小一部分功能,比如集合的声明和处理以及函数式风格等。

      废话少说,上图先:

      我们会发现里面太多的东西,基本上全部加起来得有数百个上千的类了,但是所经常使用的其实就几十个类。其实可以在项目中建立common-utils包专门抄一部分guava的类过去,而不必全部将guava依赖进来。

      工作中使用最多的莫过于List、set、map、string,I/O了,先看Lists吧。

    @GwtCompatible(emulated = true)
    public final class Lists {}

    这个是guava中Lists工具的声明,这个GwtCompatible的注解有两个参数,一个是serializable 一个是imulated,都是boolean的值,表示是否需要支持序列化、是否仿真(其实就是是否和JVM的默认实现不一致)。guava中的注释写的非常详细,方法也非常多,但实际上我经常用到的只不过是某些list的声明和一些将list拆分的功能,所以我就只关心那几个方法了。上图看下guava lists类的方法:

    其实里面很多方法就是使用泛型简化平时手工去敲的操作。有些方法在jdk1.7及以后已经应该变成deprecated。

     @GwtCompatible(serializable = true)
      public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
        checkNotNull(elements); // for GWT
        // Let ArrayList's sizing logic work, if possible
        return (elements instanceof Collection)
            ? new ArrayList<E>(Collections2.cast(elements))
            : newArrayList(elements.iterator());
      }

    Lists中newArrayList和newLinkedList等有好几个重载方法,其实就是使用泛型去简化一些工作。可能有人疑问我用Lists.newArrayList(xxx)和直接new ArrayList<?>()有什么区别,其实就是省点打字的功夫。比如你创建一个List<Map<String,Map<String,Object>> 这样子的list,如果你要用new的话得还得费很大劲去敲键盘,其实用guava去声明只需要使用重载方法就行了:

    List<Map<String,Map<String,Object>>> list = Lists.newArrayList();

    其实后面的创建的LinkedList、copyonwriteArrayList等等如出一辙,就不再多看。

    还有一个比较有用的方法是拆分list:

    public static <T> List<List<T>> partition(List<T> list, int size) {
        checkNotNull(list);
        checkArgument(size > 0);
        return (list instanceof RandomAccess)
            ? new RandomAccessPartition<T>(list, size)
            : new Partition<T>(list, size);
      }

    比如当你需要请求别人的API传入参数时对方的入参数量有限制,可以先拆分然后顺序请求获得结果。

    RandomAccess意思是加快访问速度,不保证顺序但是可以让所有元素都常量时间拿到。下面列出Partition的详细代码:

    private static class Partition<T> extends AbstractList<List<T>> {
        final List<T> list;
        final int size;
    
        Partition(List<T> list, int size) {
          this.list = list;
          this.size = size;
        }
    
        @Override
        public List<T> get(int index) {
          checkElementIndex(index, size());
          int start = index * size;
          int end = Math.min(start + size, list.size());
          return list.subList(start, end);
        }
    
        @Override
        public int size() {
          return IntMath.divide(list.size(), size, RoundingMode.CEILING);
        }
    
        @Override
        public boolean isEmpty() {
          return list.isEmpty();
        }
      }

    也就是当你get的时候,它去进行subList操作。

    接下来是一些很小众的功能了:

      @Beta
      public static ImmutableList<Character> charactersOf(String string) {
        return new StringAsImmutableList(checkNotNull(string));
      }

    获得一个String的不可变Char。

      @Beta
      public static List<Character> charactersOf(CharSequence sequence) {
        return new CharSequenceAsList(checkNotNull(sequence));
      }

    获得一个charsquence的list

     @CheckReturnValue
      public static <T> List<T> reverse(List<T> list) {
        if (list instanceof ImmutableList) {
          return ((ImmutableList<T>) list).reverse();
        } else if (list instanceof ReverseList) {
          return ((ReverseList<T>) list).getForwardList();
        } else if (list instanceof RandomAccess) {
          return new RandomAccessReverseList<T>(list);
        } else {
          return new ReverseList<T>(list);
        }
      }

    反转一个list。

    剩下还有很多重写方法和static的protected的方法,但是都很常见。接下来去看一下Sets类吧。

       

  • 相关阅读:
    进程同步中的读者写者问题
    操作系统进程同步习题记录
    基于Python Flask的web日程管理系统
    面向对象第四单元及课程总结博客
    Vimtutor(中文版)学习笔记各章小结
    常用设计模式汇总说明
    图解Apache Mina
    Rocketmq 集群
    读《图解HTTP》有感-(HTTP首部)
    读《图解HTTP》有感-(与HTTP协作的WEB服务器)
  • 原文地址:https://www.cnblogs.com/congsg2016/p/java_learning_journal.html
Copyright © 2020-2023  润新知