Guava之FluentIterable使用示例
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);
}
}
参考:
Guava之FluentIterable使用示例的更多相关文章
- guava学习--FluentIterable
public class FluentIterableTest { public static void main(String[] args) { Man man1 = new Man(" ...
- Guava之ImmutableMap使用示例
ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对. 分析以下情景,来具体讨论这个的好处. 假设现在有需求如下:根据数据库存的某个key字段 ...
- Guava API - FluentIterable Predicate Function Odering Range Splitter
这写API可解决的问题 1. 集合元素的过滤 - FluentIterable Predicate Range Function 1) 先说Predicate<T>,这个相当与一个过滤原则 ...
- Guava RateLimiter限流器使用示例
Guava中的RateLimiter可以限制单进程中某个方法的速率,本文主要介绍如何使用,实现原理请参考文档:推荐:超详细的Guava RateLimiter限流原理解析和推荐:RateLimiter ...
- Guava之Iterables使用示例
这是一个常量工具类.Iterables类包含了一系列的静态方法,来操作或返回Iterable对象. public final class Iterables { private Iterables() ...
- Guava Cache 使用笔记
https://www.cnblogs.com/parryyang/p/5777019.html https://www.cnblogs.com/shoren/p/guava_cache.html J ...
- 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 ...
- Spring cloud微服务安全实战-3-3 API安全机制之流控
首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...
- Guava并发:ListenableFuture与RateLimiter示例
ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强 RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程 ...
随机推荐
- jQuery中click(),bind(),live()的区别(转)
原文:http://www.jquery001.com/click%28%29-bind%28%29-live%28%29-delegate%28%29.html click(),bind(),liv ...
- 024.Zabbix告警等级机制
一 等级告警 告警升级可以对告警结果按自定义的时间段进行进行消息发送,并执行命令,形成一个梯度的告警处理. 二 按时间自定义告警梯度 2.1 添加时间发生的时间戳和发送时间 2.2 设置三个等级梯度 ...
- Git 版本控制管理(一)
Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介绍 Git —— The stupid content tracker(傻瓜式的内容跟踪器) 关于 Git 的 ...
- MIT-6.828-JOS-lab5:File system, Spawn and Shell
Lab 5: File system, Spawn and Shell tags: mit-6.828 os 概述 本lab将实现JOS的文件系统,只要包括如下四部分: 引入一个文件系统进程(FS进程 ...
- 【python学习-1】python环境设置与开发
开始学习python,打算把学习过程都记下来. 下载python,虽然推荐官网,但是感觉官网上面下载python太慢,所以我最后是在csdn上面下载的python版本(3.2.4 windows 64 ...
- IP基础知识与分配实现
一.IP寻址 1.划分网络ID和主机ID的最初方案是使用地址分类. 2.A类:0.0.0.0-127.255.255.255 B类:128.0.0.0-191.255.255.255 C类:192.0 ...
- 在多线程中使用spring的bean
由于spring在java开发中的广泛运用大大的方便了开发的同时,当运用一些技术比如多线程等 在由spring管理的配置文件中,可以通过封装spring提供工具,手动获得spring管理的bean,这 ...
- MikroTik RouterOS安装chr授权到阿里云虚拟机(转)
CHR介绍 CHR(Cloud Hosted Router) 是用于在虚拟机上运行的 RouterOS 版本,它支持x86_64架构,支持大多数流行的虚拟化技术,如 VMWare, Hyper-V, ...
- 李善友《认知升级之第一性原理》--507张PPT全解!_搜狐科技_搜狐网
http://www.sohu.com/a/151470602_733114
- 使用Axure RP原型设计实践04,了解全局变量
变量是一个可以变的数,可以看作是一个数据的容器.变量有2个操作,一个是读,一个是写.Axure的全局变量是指任何时候都可以对这个变量进行读写操作. 点击工具栏Project下的Global Varia ...