FluentIterable 是guava集合类中常用的一个类,主要用于过滤、转换集合中的数据;FluentIterable 是一个抽象类,实现了Iterable接口,大多数方法都返回FluentIterable对象,这也是guava的思想之一。
下面主要针对filter 和transform方法进行演示。
filter方法要接收Predicate接口,transform接收Function接口,一般在方法中采用new接口实现回调方法apply的方式。
首先构造集合中的元素类型
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() { return "User{" + "age=" + age + ", name=‘" + name + ‘\‘‘ + ‘}‘; } }
1.过滤出年龄是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>
我使用的jdk版本是1.7,所以只能使用20.0以下的guava版本。因为没有java.util.function.Predicate这个接口~
2.转换集合类型 ,把list中的user对象转换为String
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
3.拿到所有用户的年龄
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]
参考: