• Guava工具类


    转自 https://blog.csdn.net/qq_34231010/article/details/82530368

    一、集合工具
    1.Lists

    List<Integer> list1 = Lists.newArrayList(0, 2, 5);
    List<Integer> list2 = Lists.newArrayList(3, 4);
    // 以指定大小分割list
    System.out.println(Lists.partition(list1, 2)); // [[0, 2], [5]]
    // list反转
    System.out.println(Lists.reverse(list1)); // [5, 2, 0]
    // 返回字符串的不可变列表
    System.out.println(Lists.charactersOf("123")); // [1, 2, 3]
    // 计算多个list的笛卡尔积
    System.out.println(Lists.cartesianProduct(list1, list2)); // [[0, 3], [0, 4], [2, 3], [2, 4], [5, 3], [5, 4]]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    2.Sets

    Set<String> set1 = Sets.newHashSet("1", "2", "3", "4", "2", "3"); // [1, 2, 3, 4]
    Set<String> set2 = Sets.newHashSet("3", "4", "5", "6", "6"); // [3, 4, 5, 6]
    // 计算两set的合集
    System.out.println(Sets.intersection(set1, set2)); // [3, 4]
    // 计算两set的差集
    System.out.println(Sets.difference(set1, set2)); // [1, 2]
    // 计算对称差集
    System.out.println(Sets.symmetricDifference(set1, set2)); // [1, 2, 5, 6]
    // 计算并集
    System.out.println(Sets.union(set1, set2)); // [1, 2, 3, 4, 5, 6]
    // 计算所有子集
    System.out.println(Sets.powerSet(set1)); // powerSet({1=0, 2=1, 3=2, 4=3})
    System.out.println(Sets.newHashSet(Sets.powerSet(set1))); // [[], [1, 2], [1, 3], [2, 3], [1, 4], [2, 4], [3, 4], [1, 2, 3, 4], [1], [2], [3], [4], [1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]
    // 计算笛卡尔积方法见 Lists
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    集合运算返回 Sets.SetView 的实例,可通过 immutableCopy() 变为不可变集合,读取效率更高。

    3.Maps

    Map<Integer, String> map1 = ImmutableMap.of(1, "a", 2, "b", 3, "a");
    Map<Integer, String> map2 = ImmutableMap.of(2, "b", 3, "c", 4, "d");
    MapDifference<Integer, String> difference = Maps.difference(map1, map2);
    // 键只存在左边的映射
    System.out.println(difference.entriesOnlyOnLeft()); // {1=a}
    // 键只存在右边的映射
    System.out.println(difference.entriesOnlyOnRight()); // {4=d}
    // 左、右键值对都相同的映射
    System.out.println(difference.entriesInCommon()); // {2=b}
    // 键相同但值不同的映射项
    System.out.println(difference.entriesDiffering()); // {3=(a, c)}
    // 左、右键值对是否全部相同
    System.out.println(difference.areEqual()); // false
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    4.Multisets

    Multiset<String> multiset1 = HashMultiset.create(Lists.newArrayList("b", "b", "a")); // [a, b x 2]
    Multiset<String> multiset2 = HashMultiset.create(Lists.newArrayList("b", "b", "b", "b", "b", "a")); // [a, b x 5]
    // multiset1中是否包含所有multiset2中的元素
    System.out.println(multiset1.containsAll(multiset2)); // true
    // 对于任意o,若 multiset1.count(o) >= multiset2.count(o),返回true
    System.out.println(Multisets.containsOccurrences(multiset1, multiset2)); // false
    // 计算multiset1和multiset2所有元素总和
    System.out.println(Multisets.sum(multiset1, multiset2)); // [a x 2, b x 7]
    // 将元素按次数降序排序,返回不可变集合
    System.out.println(Multisets.copyHighestCountFirst(multiset1)); // [b x 2, a]
    // 对multiset1中的重复元素,仅在multiset2中删除相同个数
    Multisets.removeOccurrences(multiset2, multiset1);
    System.out.println(multiset2); // [b x 3]
    // 修改multiset2,保证任意o满足 multiset2.count(o) <= multiset1.count(o)
    Multisets.retainOccurrences(multiset2, multiset1);
    System.out.println(multiset2); // [b x 2]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Multiset同样支持Sets中的部分集合操作。

    5.Multimaps

    // forMap() 与 invertFrom()
    Map<Integer, String> map = ImmutableMap.of(1, "a", 2, "b", 3, "a");
    System.out.println(map); // {1=a, 2=b, 3=a}
    HashMultimap<String, Integer> multimap = Multimaps.invertFrom(Multimaps.forMap(map), HashMultimap.create());
    System.out.println(multimap); // {a=[1, 3], b=[2]}
    1
    2
    3
    4
    5
    forMap将map包装为SetMultimap,invertFrom对Multimaps的键和值进行反转。

    6.Tables

    Table<String, String, Integer> hashTable = HashBasedTable.create();
    hashTable.put("0", "0", 0); hashTable.put("0", "1", 1);
    hashTable.put("1", "0", 2); hashTable.put("1", "1", 3);
    hashTable.put("2", "0", 2); hashTable.put("2", "1", 3);
    System.out.println(hashTable.cellSet()); // [(0,0)=0, (0,1)=1, (1,0)=2, (1,1)=3, (2,0)=2, (2,1)=3]
    System.out.println(Tables.transpose(hashTable).cellSet()); // [(0,0)=0, (1,0)=1, (0,1)=2, (1,1)=3, (0,2)=2, (1,2)=3]
    1
    2
    3
    4
    5
    6
    transpose()方法能够将 Table<R, C, V> 转为 Table<C, R, V>。用于有向图的反转。

    二、 Iterables
    Guava提供的工具方法更偏向于接受Iterable而不是Collection类型。因此,很多你期望的支持所有集合的操作都在Iterables类中。大多数Iterables方法有一个在Iterators类中的对应版本,用来处理Iterator。

    List<Integer> list1 = Lists.newArrayList(2, 2, 5, 7, 1);
    List<Integer> list2 = Lists.newArrayList(2, 5, 1, 7);
    // 返回iterable中第一个元素,不存在返回默认值-1
    System.out.println(Iterables.getFirst(list2, -1)); // 2
    // 返回iterable中最后一个元素,不存在抛出NoSuchElementException
    System.out.println(Iterables.getLast(list2)); // 7
    // 判断iterable中是否包含元素
    System.out.println(Iterables.contains(list2, 3)); // false
    System.out.println(Iterables.elementsEqual(list1, list2)); // false
    System.out.println(Iterables.concat(list1, list2)); // [2, 2, 5, 7, 1, 2, 5, 1, 7]
    System.out.println(Iterables.frequency(list1, 2)); // 2
    System.out.println(Iterables.limit(list1, 3)); // [2, 2, 5]
    System.out.println(Iterables.partition(list1, 4)); // [[2, 2, 5, 7], [1]]
    System.out.println(Iterables.paddedPartition(list1, 4)); // [[2, 2, 5, 7], [1, null, null, null]]
    System.out.println(Iterables.skip(list1, 2)); // [5, 7, 1]
    // System.out.println(Iterables.getOnlyElement(list2)); // java.lang.IllegalArgumentException: expected one element but was: <2, 5, 1, 7>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    三、集合扩展工具
    1.Forwarding装饰器
        Forwarding装饰器提供了一个抽象方法:delegate(),使用者通过创建ForwardingXXX的子类并重写delegate()方法增加装饰功能。
    以ForwardingList为例,delegate()的返回类型为List<E>,方法实现为:

    public void add(int index, E element) {
    delegate().add(index, element);
    }
    1
    2
    3
    因此,当想要实现其他功能时,我们可以重写add()方法来达到想要的功能。

    2.PeekingIterator
        通过 Iterators.peekingIterator(iterator) 包装成PeekingIterator,该接口提供了一个peek()方法,能够提前“偷看”到下一次调用next()返回的元素,但需要注意的是当便利到最后一个元素时,使用peek()会抛出NoSuchElementException异常。

    3.AbstractIterator
        抽象类AbstractIterator可以实现自定义的Iterator,通过重写computeNext()方法来实现迭代。由于该抽象类继承了UnmodifiableIterator,因此不支持remove()操作。
    ————————————————
    版权声明:本文为CSDN博主「骄傲的白兰地」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_34231010/article/details/82530368

  • 相关阅读:
    更改开机运行级别
    三个路由的路由表信息
    网络
    网卡配置文件与网络命令显示不一致
    使CentOS7恢复网卡传统命名
    删除CentOS7的虚拟网卡
    将克隆的eth3和eth4改为eth0和eth1
    单臂路由--1个物理网卡绑定多个IP地址
    洛谷P1098 字符串的展开
    洛谷P1086 花生采摘
  • 原文地址:https://www.cnblogs.com/winkey4986/p/12427382.html
Copyright © 2020-2023  润新知