`

Guava中针对集合的 filter和过滤功能

 
阅读更多
在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子:

  
@Test
public void whenFilterWithIterables_thenFiltered() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Iterable<String> result = Iterables.filter(names, Predicates.containsPattern("a"));
 
    assertThat(result, containsInAnyOrder("Jane", "Adam"));
}


  在这个例子中,给出一个list,过滤出含有字母a的元素

此外,可以使用Collections2.filter() 去进行过滤
@Test
public void whenFilterWithCollections2_thenFiltered() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Collection<String> result = Collections2.filter(names, Predicates.containsPattern("a"));
     
    assertEquals(2, result.size());
    assertThat(result, containsInAnyOrder("Jane", "Adam"));
 
    result.add("anna");
    assertEquals(5, names.size());
}



  这里注意的是,Collections2.filter中,当在上面的result中增加了元素后,会直接影响原来的names这个list的,就是names中的集合元素是5了。
  再来看下predicates判断语言,
com.google.common.base. Predicate : 根据输入值得到 true 或者 false

拿Collections2中有2个函数式编程的接口:filter , transform ,例如 :在Collection<Integer>中过滤大于某数的内容:


Collection<Integer> filterList = Collections2.filter(collections

     , new Predicate<Integer>(){

                  @Override

                  public boolean apply(Integer input) {

                        if(input > 4)

                              return false;

                        else

                              return true;

                  }

});



把Lis<Integer>中的Integer类型转换为String , 并添加test作为后缀字符:

List<String> c2 = Lists.transform(list, new Function<Integer , String>(){

                  @Override

                  public String apply(Integer input) {

                        return String.valueOf(input) + "test";

                  }            

});




需要说明的是每次调用返回都是新的对象,同时操作过程不是线程安全的。

    再来点例子:
  

@Test
public void whenFilterCollectionWithCustomPredicate_thenFiltered() {
    Predicate<String> predicate = new Predicate<String>() {
        @Override
        public boolean apply(String input) {
            return input.startsWith("A") || input.startsWith("J");
        }
    };
 
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Collection<String> result = Collections2.filter(names, predicate);
 
    assertEquals(3, result.size());
    assertThat(result, containsInAnyOrder("John", "Jane", "Adam"));
}


    将多个prdicate进行组合
@Test
public void whenFilterUsingMultiplePredicates_thenFiltered() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Collection<String> result = Collections2.filter(names, 
      Predicates.or(Predicates.containsPattern("J"), 
      Predicates.not(Predicates.containsPattern("a"))));
 
    assertEquals(3, result.size());
    assertThat(result, containsInAnyOrder("John", "Jane", "Tom"));
}


  
     上面的例子中找出包含J字母或不包含a的元素;
  
再看下如何将集合中的空元素删除:
  
@Test
public void whenRemoveNullFromCollection_thenRemoved() {
    List<String> names = Lists.newArrayList("John", null, "Jane", null, "Adam", "Tom");
    Collection<String> result = Collections2.filter(names, Predicates.notNull());
 
    assertEquals(4, result.size());
    assertThat(result, containsInAnyOrder("John", "Jane", "Adam", "Tom"));
}



    检查一个collection中的所有元素是否符合某个条件:
  
 @Test
public void whenCheckingIfAllElementsMatchACondition_thenCorrect() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
 
    boolean result = Iterables.all(names, Predicates.containsPattern("n|m"));
    assertTrue(result);
 
    result = Iterables.all(names, Predicates.containsPattern("a"));
    assertFalse(result);
}



   下面看如何把一个list进行转换,
@Test
public void whenTransformWithIterables_thenTransformed() {
    Function<String, Integer> function = new Function<String, Integer>() {
        @Override
        public Integer apply(String input) {
            return input.length();
        }
    };
 
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Iterable<Integer> result = Iterables.transform(names, function);
 
    assertThat(result, contains(4, 4, 4, 3));
}


   
  再看结合transform和predicates结合使用的例子:
  
@Test
public void whenCreatingAFunctionFromAPredicate_thenCorrect() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Collection<Boolean> result =
      Collections2.transform(names,
      Functions.forPredicate(Predicates.containsPattern("m")));
 
    assertEquals(4, result.size());
    assertThat(result, contains(false, false, true, true));
}



    在这个例子中,将一个LIST中的每一个元素进行使用Predicates.containsPattern,判断是否包含m,返回的是boolean,然后再得到的boolean值一起转换为collection


    下面是两个function一起结合使用的例子:

 

@Test
public void whenTransformingUsingComposedFunction_thenTransformed() {
    Function<String,Integer> f1 = new Function<String,Integer>(){
        @Override
        public Integer apply(String input) {
            return input.length();
        }
    };
 
    Function<Integer,Boolean> f2 = new Function<Integer,Boolean>(){
        @Override
        public Boolean apply(Integer input) {
            return input % 2 == 0;
        }
    };
 
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Collection<Boolean> result = Collections2.transform(names, Functions.compose(f2, f1));
 
    assertEquals(4, result.size());
    assertThat(result, contains(true, true, true, false));
}


   在这个例子中,首先应用函数f1,求出每个元素的长度,然后再根据f1函数,分别返回
它们的boolean值,再转换为collection.
  
   最后看下将filter和transform结合使用的例子:
  
@Test
public void whenFilteringAndTransformingCollection_thenCorrect() {
    Predicate<String> predicate = new Predicate<String>() {
        @Override
        public boolean apply(String input) {
            return input.startsWith("A") || input.startsWith("T");
        }
    };
 
    Function<String, Integer> func = new Function<String,Integer>(){
        @Override
        public Integer apply(String input) {
            return input.length();
        }
    };
 
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Collection<Integer> result = FluentIterable.from(names)
                                               .filter(predicate)
                                               .transform(func)
                                               .toList();
 
    assertEquals(2, result.size());
    assertThat(result, containsInAnyOrder(4, 3));
}


1
0
分享到:
评论

相关推荐

    java基础 集合-26-Guava开源组件使用(4)

    1. **Guava集合类**:Guava提供了一些增强版的集合类,如Multiset(多集)、Multimap(多映射)和Table(表格),这些类能够处理更复杂的集合操作。Multiset允许元素有多个计数,而Multimap可以将一个键映射到多个值...

    【技术分享】Bloomfilter布隆过滤器.pptx

    布隆过滤器是一种高效的空间节省的数据结构,用于判断一个元素是否可能在一个集合中,但可能会产生一定的误判率。它由一个很长的二进制向量和多个独立的哈希函数组成。布隆过滤器的基本原理是,当一个元素被添加到...

    Google Guava 30.1.1常用类介绍及实践代码

    以上只是 Guava 30.1.1 版本中的一部分核心功能,实际使用中还有许多其他实用工具类,如 `Range`, `EventBus`, `RateLimiter` 等。Guava 的设计目标是提高代码质量和效率,通过提供这些工具类,开发者可以更加专注于...

    Java版本的BloomFilter (布隆过滤器)

    **布隆过滤器(Bloom Filter)**是一种空间效率极高的概率型数据结构,用于测试一个元素是否在一个集合中。由Burton Howard Bloom在1970年提出,主要用于节省存储空间,尤其在大数据场景下,它能有效地解决大规模...

    介绍Bloom Filter(布隆过滤器)原理、实现及具体应用

    布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。它可能会误判,但不会漏判,即可能存在假阳性(False Positive),但绝不会有假阴性(False Negative)。...

    java-bloomfilter

    布隆过滤器(Bloom Filter)是计算机科学中一种高效的空间节省的数据结构,主要用于判断一个元素是否可能存在于一个大规模集合中。它由伯特·布隆(Burton Howard Bloom)在1970年提出,因此得名。布隆过滤器在处理...

    Guava教程(4)条件,多重映射和分片Java开发Jav

    在Guava库中,条件是一种强大的工具,用于在Java代码中创建和应用过滤器。它是一个返回布尔值的函数,可以用于测试对象是否满足特定条件。例如,我们可以创建一个条件来检查一个整数是否大于10: ```java Predicate...

    布隆过滤器-BloomFilter

    布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否可能在一个集合中。由布隆在1970年提出,它不像传统的数据结构如哈希表那样保证不误判,而是允许有一定的错误率。这种特性使得...

    java8-guava-comparation:Guava 和 Java 8 Stream API 的比较

    Java 8 和 Google Guava 都是 Java 开发者在处理集合操作时的重要工具,它们提供了许多方便的功能,如流(Stream)、函数式编程、缓存、多线程支持等。这里我们将深入探讨 Guava 与 Java 8 Stream API 在功能、用法...

    java list 过滤

    在Java编程中,`List`过滤是一个常见的任务,它涉及到集合操作和条件判断。当我们需要从一个`List`中筛选出满足特定条件的元素时,Java提供了多种方式来实现这一功能。这篇博客“java list 过滤”可能深入探讨了这些...

    bloom-filter:Java中Bloom过滤器的实现

    Guava的BloomFilter提供了创建、添加元素和查询元素的方法,并且支持动态调整过滤器的大小以控制误判率。以下是一个简单的使用示例: ```java import com.google.common.hash.BloomFilter; import ...

    bloom过滤器解决缓存击穿问题1

    例如,Java中的Guava库提供了BloomFilter类。在测试中,我们可以看到,即使是百万级别的数据集,判断一个元素是否存在于集合中,也只需要几十微秒的时间,性能极其高效。同时,布隆过滤器的误判率可以通过设置参数...

    缓存问题解决方案&批量查询优化1

    布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中,存在一定的误判率。 2. **BloomFilter(布隆过滤器)** 布隆过滤器由一个很长的二进制向量和几个独立的哈希函数组成。当一个...

    Java Map 通过 key 或者 value 过滤的实例代码

    在这里,我们可以使用 Guava 库的 `Maps.filterKeys` 方法来过滤 Map 中的数据,例如: ```java Map, String&gt; map = Maps.filterKeys(WEEK, r -&gt; r ); ``` 这种方式非常简洁和高效。 总结 在本文中,我们讨论了...

    google common jar包

    这个早期版本的Google Collections库虽然没有后来的Guava库那么全面,但它已经展示了强大的功能和对Java集合框架的深入理解。在那个年代,它极大地推动了Java社区对于更高效、更易用的代码实践的探索和发展。如果你...

    Bloom-Filter:Java中Bloom Filter数据结构的实现

    布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它可能会误判,但不会漏判,即可能会将不存在的元素判断为存在,但不会将存在的元素判断为不存在。这种特性使得...

    java lib库部分2

    7. **Google Guava**:Guava是Google提供的一套广泛使用的Java库,涵盖了缓存、并发、集合、I/O等多个领域,其强大的功能和优秀的性能受到许多开发者喜爱。 8. **Spring Framework**:对于企业级应用开发,Spring...

    google的collection包

    例如,`Collections2.filter()`方法可以根据指定的条件过滤集合元素,`Iterables.transform()`则可以将一个集合中的每个元素应用一个函数进行转换。 在实际开发中,谷歌Collection包的这些高级数据结构和工具极大地...

    Java常用工具类

    `Stream`可以对集合、数组等数据源进行操作,如过滤(`filter()`)、映射(`map()`)和聚合(`collect()`)。 7. **`java.util.concurrent` 包**: - 提供并发编程工具,如线程池(`ExecutorService`)、同步工具...

    Redis 缓存穿透解决方案与原理.pdf

    例如,Google的Guava库提供了一个BloomFilter类,可以方便地实现布隆过滤器的功能。 为了更深入地理解缓存穿透问题及其解决方案,可以参加技术分享讲座,如文中提到的咕泡学院在腾讯课堂的【Redis 缓存穿透解决方案...

Global site tag (gtag.js) - Google Analytics