FluentIterable 是guava集合类中常用的一个类,主要用于过滤、转换集合中的数据;FluentIterable是一个抽象类,实现了Iterable接口,大多数方法都返回FluentIterable对象,这也是guava的思想之一。

首先构造集合中的元素类型

public class User {
private int age;
private String name; public User() {
} public User(int age, String name) {
this.age = age;
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public String toString() {
final StringBuilder sb = new StringBuilder("User{");
sb.append("age=").append(age);
sb.append(", name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}

常用方法

1.过滤(filter)元素

filter方法要接收Predicate接口

/**
* Returns the elements from this fluent iterable that satisfy a predicate.
* The resulting fluent iterable's iterator does not support remove().
*/
public final FluentIterable<E> filter(Predicate<? super E> predicate) {
return from(Iterables.filter(getDelegate(), predicate));
}
/**
* Returns the elements from this fluent iterable that are instances of class type.
*
*/
@GwtIncompatible // Class.isInstance
public final <T> FluentIterable<T> filter(Class<T> type) {
return from(Iterables.filter(getDelegate(), type));
}

过滤出年龄是20岁的用户

public class Test {
public static void main(String[] args) {
List<User> userList = Lists.newArrayList();
userList.add(new User(18, "zhangsan"));
userList.add(new User(20, "lisi"));
userList.add(new User(22, "wangwu"));
FluentIterable<User> filter = FluentIterable.from(userList).filter(
new Predicate<User>() {
@Override
public boolean apply(User user) {
return user.getAge() == 20;
}
});
for (User user : filter) {
System.out.println(user);
}
}
}

打印效果:

User{age=20, name='lisi'}

这里有一个潜在的坑,在高版本(21.0++)的guava中Predicate接口继承了java 8中的java.util.function.Predicate

@FunctionalInterface
@GwtCompatible
public interface Predicate<T> extends java.util.function.Predicate<T>

2.转换(transform)集合类型,transform接收Function接口,一般在方法中采用new接口实现回调方法apply的方式。

/**
* Returns a fluent iterable that applies function to each element of this fluent
* iterable.
*
* <p>The returned fluent iterable's iterator supports remove() if this iterable's
* iterator does. After a successful remove() call, this fluent iterable no longer
* contains the corresponding element.
*/
public final <T> FluentIterable<T> transform(Function<? super E, T> function) {
return from(Iterables.transform(getDelegate(), function));
}
public class Test {
public static void main(String[] args) {
List<User> userList = Lists.newArrayList();
userList.add(new User(18, "zhangsan"));
userList.add(new User(20, "lisi"));
userList.add(new User(22, "wangwu"));
FluentIterable<String> transform = FluentIterable.from(userList).transform(
new Function<User, String>() {
@Override
public String apply(User user) {
return Joiner.on(",").join(user.getName(), user.getAge());
}
});
for (String user : transform) {
System.out.println(user);
}
}
}

打印效果

zhangsan,18
lisi,20
wangwu,22

Function接口的定义

public interface Function<F, T>

From-->To

拿到所有用户的年龄

public class Test {
public static void main(String[] args) {
List<User> userList = Lists.newArrayList();
userList.add(new User(18, "zhangsan"));
userList.add(new User(20, "lisi"));
userList.add(new User(22, "wangwu"));
List<Integer> ages = FluentIterable.from(userList).transform(
new Function<User, Integer>() {
@Override
public Integer apply(User input) {
return input.getAge();
}
}).toList();
System.out.println(ages);
}
}

打印结果

[18, 20, 22]
public final class Test {

    public static <F, T> void main(String[] args) {
List<F> fromList = new ArrayList<F>();
List<T> result = FluentIterable.from(fromList).transform(new Function<F, T>() {
@Override
public T apply(F input) {
// 可以根据需要写一个转换器
// 将类型F转换成T
return XXConverter.convert(input);
}
}).toList();
}
}
class XXConverter<F, T> { public static <F, T> T convert(F f) {
return null;
}
}

3.集合中的元素是否都满足某个条件

/**
* Returns true if every element in this fluent iterable satisfies the predicate. If this
* fluent iterable is empty, true is returned.
*/
public final boolean allMatch(Predicate<? super E> predicate) {
return Iterables.all(getDelegate(), predicate);
}
public class Test {
public static void main(String[] args) {
List<User> userList = Lists.newArrayList();
userList.add(new User(18, "zhangsan"));
userList.add(new User(20, "lisi"));
userList.add(new User(22, "wangwu"));
boolean allMatch = FluentIterable.from(userList).allMatch(
new Predicate<User>() {
@Override
public boolean apply(User input) {
return input.getAge() >= 18;
}
});
//true
System.out.println(allMatch);
}
}

4.集合中的任何一个元素满足指定的条件即可

/**
* Returns true if any element in this fluent iterable satisfies the predicate.
*/
public final boolean anyMatch(Predicate<? super E> predicate) {
return Iterables.any(getDelegate(), predicate);
}
public class Test {
public static void main(String[] args) {
List<User> userList = Lists.newArrayList();
userList.add(new User(18, "zhangsan"));
userList.add(new User(20, "lisi"));
userList.add(new User(22, "wangwu"));
boolean allMatch = FluentIterable.from(userList).anyMatch(
new Predicate<User>() {
@Override
public boolean apply(User input) {
return input.getAge() >= 22;
}
});
//true
System.out.println(allMatch);
}
}

参考:

集合中的FluentIterable类

Guava之FluentIterable使用示例的更多相关文章

  1. guava学习--FluentIterable

    public class FluentIterableTest { public static void main(String[] args) { Man man1 = new Man(" ...

  2. Guava之ImmutableMap使用示例

    ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对. 分析以下情景,来具体讨论这个的好处. 假设现在有需求如下:根据数据库存的某个key字段 ...

  3. Guava API - FluentIterable Predicate Function Odering Range Splitter

    这写API可解决的问题 1. 集合元素的过滤 - FluentIterable Predicate Range Function 1) 先说Predicate<T>,这个相当与一个过滤原则 ...

  4. Guava RateLimiter限流器使用示例

    Guava中的RateLimiter可以限制单进程中某个方法的速率,本文主要介绍如何使用,实现原理请参考文档:推荐:超详细的Guava RateLimiter限流原理解析和推荐:RateLimiter ...

  5. Guava之Iterables使用示例

    这是一个常量工具类.Iterables类包含了一系列的静态方法,来操作或返回Iterable对象. public final class Iterables { private Iterables() ...

  6. Guava Cache 使用笔记

    https://www.cnblogs.com/parryyang/p/5777019.html https://www.cnblogs.com/shoren/p/guava_cache.html J ...

  7. Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCompc dtS420 \s2018 s4f doc homepc \s2018 s4 doc compc dtS44\(5 封私信 _ 44 条消息)WebSocket 有没有可能取代 AJAX

    Atitit s2018 s4 doc list dvchomepc dvccompc.docx .docx \s2018 s4 doc compc dtS44 \s2018 s4 doc dvcCo ...

  8. Spring cloud微服务安全实战-3-3 API安全机制之流控

    首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...

  9. Guava并发:ListenableFuture与RateLimiter示例

    ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强 RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程 ...

随机推荐

  1. springmvc中使用MockMvc测试controller

    示例代码 import com.alibaba.fastjson.JSONObject; import org.junit.Before; import org.junit.Test; import ...

  2. CF815C Karen and Supermarket

    题目链接 CF815C Karen and Supermarket 题解 只要在最大化数量的前提下,最小化花费就好了 这个数量枚举ok, dp[i][j][1/0]表示节点i的子树中买了j件商品 i ...

  3. Android ListView CheckBox状态错乱(转)

    转自:http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html listView中包含checkBox的时候,经常会发生其中的checkB ...

  4. 13、Redis的发布订阅模式

     写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------------------- ...

  5. Regex.Split

    private static List<int> GetThemeIds(string themeList) { const string split = "!===!" ...

  6. 如何运行Hadoop自带的例子

    bin/hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.6.4.jar wordcount /WordCount/WordC ...

  7. linux socket TCP UDP bind 同义IP和port

    //TCP and UDP can bind to the same IP & port. #include <sys/types.h> #include <sys/sock ...

  8. 安装oracle10g“程序异常终止。发生内部错误。请将以下文件提供给oracle技术支持部门

    发生情景:测试环境搭建的是windows 2008 r2 sp1系统 在安装Oracle 10g数据库时发生了错误,现在把解决问题的方法和原因分享给大家. *  安装出现的现象: 输入完密码后下一步时 ...

  9. IEnumerable是集合,IEnumerator是集合的迭代器

    我们常用IEnumerable,却忽视IEnumerator.简单来说,IEnumerable是可以被循环遍历的集合,IEnumerator实施循环遍历. 接口分别是: public interfac ...

  10. C# String.split()用法小结

    第一种方法 string s=abcdeabcdeabcde; string[] sArray=s.Split('c') ; foreach(string i in sArray) Console.W ...