Guava包学习---Maps

Maps包方法列表:

还是泛型创建Map:

public static <K, V> HashMap<K, V> newHashMap() {
    return new HashMap<K, V>();
  }

public static <K, V> HashMap<K, V> newHashMapWithExpectedSize(int expectedSize) {
    return new HashMap<K, V>(capacity(expectedSize));
  }

public static <K, V> HashMap<K, V> newHashMap(Map<? extends K, ? extends V> map) {
return new HashMap<K, V>(map);
}

public static <K, V> LinkedHashMap<K, V> newLinkedHashMap() {
return new LinkedHashMap<K, V>();
}

public static <K, V> LinkedHashMap<K, V> newLinkedHashMapWithExpectedSize(int expectedSize) {
return new LinkedHashMap<K, V>(capacity(expectedSize));
}

 public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(Map<? extends K, ? extends V> map) {
    return new LinkedHashMap<K, V>(map);
  }

 public static <K, V> ConcurrentMap<K, V> newConcurrentMap() {
    return new MapMaker().<K, V>makeMap();
  }
  public static <K extends Comparable, V> TreeMap<K, V> newTreeMap() {
    return new TreeMap<K, V>();
  }

还有一些EnumMap、IdentitiyMap等,但是不经常用,就不贴了。

Map中的不同,还有其他几种方式,这里就只贴个最常用的吧。

 public static <K, V> MapDifference<K, V> difference(
      Map<? extends K, ? extends V> left, Map<? extends K, ? extends V> right) {
    if (left instanceof SortedMap) {
      SortedMap<K, ? extends V> sortedLeft = (SortedMap<K, ? extends V>) left;
      SortedMapDifference<K, V> result = difference(sortedLeft, right);
      return result;
    }
    return difference(left, right, Equivalence.equals());
  }

Set和其他内容转Map,这个方法在获得某些对象转Map操作比较好用。

  public static <K, V> Map<K, V> asMap(Set<K> set, Function<? super K, V> function) {
    if (set instanceof SortedSet) {
      return asMap((SortedSet<K>) set, function);
    } else {
      return new AsMapView<K, V>(set, function);
    }
  }

某些对象转不可变Map,和上面一样,你只要声明一个Guava的Function覆盖以下它的方法然后传入进来即可:

 public static <K, V> ImmutableMap<K, V> toMap(
      Iterable<K> keys, Function<? super K, V> valueFunction) {
    return toMap(keys.iterator(), valueFunction);
  }

接下来这个有点牛逼的,然后从来不知道该用在哪里的方法,反正我是没碰到这种场景:

  /**
   * Returns a view of a map where each value is transformed by a function. All
   * other properties of the map, such as iteration order, are left intact. For
   * example, the code: <pre>   {@code
   *
   *   Map<String, Integer> map = ImmutableMap.of("a", 4, "b", 9);
   *   Function<Integer, Double> sqrt =
   *       new Function<Integer, Double>() {
   *         public Double apply(Integer in) {
   *           return Math.sqrt((int) in);
   *         }
   *       };
   *   Map<String, Double> transformed = Maps.transformValues(map, sqrt);
   *   System.out.println(transformed);}</pre>
   *
   * ... prints {@code {a=2.0, b=3.0}}.
   *
  public static <K, V1, V2> Map<K, V2> transformValues(
      Map<K, V1> fromMap, Function<? super V1, V2> function) {
    return transformEntries(fromMap, asEntryTransformer(function));
  }

基本上每种类型的Map都会有几个方法去处理,不一一列举。

接下里又是传入Prediction过滤Map:

  @CheckReturnValue
  public static <K, V> Map<K, V> filterKeys(
      Map<K, V> unfiltered, final Predicate<? super K> keyPredicate) {
    if (unfiltered instanceof SortedMap) {
      return filterKeys((SortedMap<K, V>) unfiltered, keyPredicate);
    } else if (unfiltered instanceof BiMap) {
      return filterKeys((BiMap<K, V>) unfiltered, keyPredicate);
    }
    checkNotNull(keyPredicate);
    Predicate<Entry<K, ?>> entryPredicate = keyPredicateOnEntries(keyPredicate);
    return (unfiltered instanceof AbstractFilteredMap)
        ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate)
        : new FilteredKeyMap<K, V>(checkNotNull(unfiltered), keyPredicate, entryPredicate);
  }
  @CheckReturnValue
  public static <K, V> Map<K, V> filterValues(
      Map<K, V> unfiltered, final Predicate<? super V> valuePredicate) {
    if (unfiltered instanceof SortedMap) {
      return filterValues((SortedMap<K, V>) unfiltered, valuePredicate);
    } else if (unfiltered instanceof BiMap) {
      return filterValues((BiMap<K, V>) unfiltered, valuePredicate);
    }
    return filterEntries(unfiltered, Maps.<V>valuePredicateOnEntries(valuePredicate));
  }
  @CheckReturnValue
  public static <K, V> Map<K, V> filterEntries(
      Map<K, V> unfiltered, Predicate<? super Entry<K, V>> entryPredicate) {
    if (unfiltered instanceof SortedMap) {
      return filterEntries((SortedMap<K, V>) unfiltered, entryPredicate);
    } else if (unfiltered instanceof BiMap) {
      return filterEntries((BiMap<K, V>) unfiltered, entryPredicate);
    }
    checkNotNull(entryPredicate);
    return (unfiltered instanceof AbstractFilteredMap)
        ? filterFiltered((AbstractFilteredMap<K, V>) unfiltered, entryPredicate)
        : new FilteredEntryMap<K, V>(checkNotNull(unfiltered), entryPredicate);
  }

应该我碰到的场景太少了,List、set、map中都有大量代码去处理Navigate类型和immutable类型的集合,感觉还是用的太少了。需要再深入研究一下。

时间: 2024-12-18 02:26:09

Guava包学习---Maps的相关文章

Guava包学习---Lists

Guava包是我最近项目中同事推荐使用的,是google推出的库.里面的功能非常多,包括了集合.缓存.原生类型支持.并发库.通用注解.字符串处理.IO等.我们项目中使用到了guava依赖,但是实际上只是用了其中很小一部分功能,比如集合的声明和处理以及函数式风格等. 废话少说,上图先: 我们会发现里面太多的东西,基本上全部加起来得有数百个上千的类了,但是所经常使用的其实就几十个类.其实可以在项目中建立common-utils包专门抄一部分guava的类过去,而不必全部将guava依赖进来. 工作中

Guava包学习---Bimap

Bimap也是Guava中提供的新集合类,别名叫做双向map,就是key->value,value->key,也就是你可以通过key定位value,也可以用value定位key. 这个场景在日常开发中还是经常碰到的. 其实,Bimap相对比较简单,它是一个接口,扩展了Map接口,里面也是<K,V>格式,只不过它不允许有重复的V,这一点很重要,当你尝试往里面put一个重复的V的是会有报错信息提示.没有重复的V也就保证了你把这个map倒置的时候从V定位K也是可以唯一定位到的,我们可以看

Guava包学习-Multimap

它和上一章的MultiSet的继承结果很相似,只不过在上层的接口是Multimap不是Multiset. Multimap的特点其实就是可以包含有几个重复Key的value,你可以put进入多个不同value但是相同的key,但是又不是让后面覆盖前面的内容. Guava中有很多multimap的变种,其实就是普通的map变种一样,这里不做详细解释,用的是拿出来就成了.先测试一下multimap的特性: public void testMultimap(){ HashMultimap<Intege

Guava包学习--Table

Table,顾名思义,就好像HTML中的Table元素一样,其实就是行+列去确定的值,更准确的比喻其实就是一个二维矩阵. 其实它就是通过行+列两个key去找到一个value,然后它又containsvalue.containsrow.containscolumn等方法来判断是否包含. 同事put方法也是3个参数:另外你可以通过row()或者column方法得到一列或者一行的一个map<k,v>值. 我感觉这个集合非常有想法,你在处理类似Dom中的二维数组中的值都可以在程序中用这个进行模拟. 具

Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习Guava EventBus(一)EventBus,我们简单的对Guava基于事件的编程进行了介绍,学习和了解了EventBus类的使用,本篇起,我们通过一系列的示例代码深入的学习EventBus类,本篇学习Guava EventBus(二)EventBus 事件订阅示例.     订阅Subscribe 首先,我们假定定义了如下所示的TradeAccountEvent类

Guava库学习:学习Guava Cache知识汇总

原文地址:Guava库学习:学习Guava Cache知识汇总 至此,我们结束了对Guava Cache 缓存机制的学习,在学习过程中,我们学习了如何简单的通过MapMaker创建最简单的ConcurrentMap缓存,我们也了解了缓存的高级特性,以及强大的LoadingCache,我们也探索和学习了CacheBuilder.CacheLoader这些核心的API,以及CacheStats.RemovalLitener等,下面对这些文章做一些汇总,方便以后的查阅和复习.     Guava库学习

Guava库学习:学习Guava Files系列(二)

原文地址:Guava库学习:学习Guava Files系列(二) 上一篇,Guava库学习:学习Guava Files系列(一)中,我们简单的学习了使用Files进行文件的读写等常用操作,本篇我们继续进行Guava Files系列的学习.     InputSupplier 和 OutputSupplier Guava提供了 InputSupplier 和 OutputSupplier接口,用于提供InputStreams/Readers 或OutputStreams/Writers的处理.我们

R语言爬虫初尝试-基于RVEST包学习

R语言爬虫初尝试-基于RVEST包学习 Thursday, February 26, 2015 在学完coursera的getting and Cleaning data后,继续学习用R弄爬虫网络爬虫.主要用的还是Hadley Wickham开发的rvest包.再次给这位矜矜业业开发各种好用的R包的大神奉上膝盖 查阅资料如下: rvest的github rvest自身的帮助文档 rvest + CSS Selector 网页数据抓取的最佳选择-戴申: 里面有提及如何快速获得html的位置.看完这

Guava库学习:学习Guava Files系列(一)

原文地址:Guava库学习:学习Guava Files系列(一) 对程序开发人员来说,文件的读写是很重要的一项技能.但是令人惊讶的是,尽管Java提供了一个丰富而健壮的I/O库,进行一些基本的文件操作却显得很繁 琐.不过在Java 7中已经发生了一些改变,但那些使用Java 6的就不那么好运了.幸运的是,Guava做了一些我们期望I/O库做的事情,提供了一系列的工具,让我们能够更方便的进行I/O操作.本篇,我们就开始来学习如何使用Guava Files进行一些I/O操作. 尽管Java 7做了一