Guava增强for循环
Guava的前身是Google Collections,是Google开发出的一个开源Java常用类库,包含了一些集合的便捷操作API。本文通过一些常用的例子来剖析Guava的奇妙之处。
Guava是如何简化for循环的呢,直接上一段例子来说明:
如果想要将一个字符数组中字符的元素剔除并且用逗号隔开,原始做法:
for(int i = 0; i < array.length; i++){
if(array[i] != null){
result.append(array[i]).append(',');
}
}
Guava类库极度简化次操作,以一种函数式编程思想链式的调用方法简化了实现
String s = Joiner.on(“,”).skipNulls().join(array);
Guava还有比着这强大的功能,闲话少说,下面介绍三种项目常用简化for循环的用法:
private List<Dog> dogs = ImmutableList.of(
new Dog("Jeff", 0.6f, MALE, new DateTime(2013, 9, 1, 0, 0, 0, 0)),
new Dog("Vivian", 1f, FEMALE, new DateTime(2013, 1, 2, 0, 0, 0, 0)));//初始化数据
1. 将一个集合元素的某一个或多个字段组成一个新的集合:
public Collection getNameList {
return Collections2.transform(dogs, new Function<Dog, String>() {
@Override
public String apply(Dog dog) {
return dog.getName();
}
});
}
用法:可以将集合里的每个对象拿出来对其进行操作,并将操作结果作为新集合的元素,返回产生的新集合。
2.筛选出集合中满足某些属性的对象
public Collection applyAge(final float from, final float to) {
return Collections2.filter(dogs, new Predicate<Dog>() {
@Override
public boolean apply(Dog dog) {
return dog.getAge() > from && dog.getAge() < to;
}
});
}
用法:在集合中找出满足某个条件的所有元素,返回一个满足条件的新集合
3.在集合中找到一个满足条件的对象
public Object getBirthdayApplyMonthDog(final int month) {
Optional<Dog> optional = Iterables.tryFind(dogs, new Predicate<Dog>() {
@Override
public boolean apply(Dog dog) {
return dog.getBirthday().getMonthOfYear() == month;
}
});
if (optional.isPresent()) {
return optional;
} else {
return "not found";
}
}
用法:在集合中找到第一个满足条件的元素,并且返回一个被Optional封装的对象,Optional对象可以避免开发人员没有判断是否为null而产生的空指针异常,是Guava提供用来包装任何对象的对象。
4. 在2和3的实例中,tryFind和filter方法都需要传一个Predicate的对象,这个对象是用来判断哪些符合条件的一个借口,需要自己实现,与此同时,Guava也提供了能够让多个条件并列或者同时满足的条件组合方法
public Object getFirstDogAppluAgeAndGender(float age, String gender) {
Optional<Dog> optional = Iterables.tryFind(dogs, and(getApplyAge(age), applyGenderDog(gender)));
if(optional.isPresent()) {
return optional.get();
}
return Optional.absent();
}
private Predicate<Dog> getApplyAge(final float age) {
return new Predicate<Dog>() {
@Override
public boolean apply(Dog dog) {
return dog.getAge() > age;
}
};
}
用法:提供了 and(or)方法来组合一个判断条件,丰富了tryFind和filter的判断条件逻辑。
总而言之,Guava给for循环带来了飞跃性的改进,让糟糕的for与if,else的冗余组合变得简单易懂,让代码变得更优美,可读性更高,确实值得所有java开发者的学习和亲睐。
Guava增强for循环的更多相关文章
- 增强for循环(forearch)
增强for循环是为了简化在遍历数组需要先获得数组的长度或者在遍历集合中的元素的时候需要使用迭代器的操作. 引入时间:JDK1.5 语法格式: for(数据类型 变量 :需要迭代的数组或者集合){ } ...
- Java学习——增强for循环、switch
增强for循环 Java5引入了一种主要用于数组的增强型for循环. 例子 public class ForTest { public static void main(String args[]){ ...
- 增强for循环用法___ArrayList数组实现使用下标最好,LinkedList使用增强型的(转载)
总结: 1.For-Each循环的缺点:丢掉了索引信息. 当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息. ...
- 关于增强for循环
1 增强for循环增强for循环是for的一种新用法!用来循环遍历数组和集合. 1.1 增强for的语法for(元素类型 e : 数组或集合对象) {}例如:int[] arr = {1,2,3};f ...
- 【Java基础】增强for循环要注意陷阱
什么是增强for循环 增强for循环是一种简单模式的for循环,为了方便数组和集合的遍历而存在. int[] arr = new int[]{1, 2, 3, 4, 5, 6}; for (int a ...
- (14)jdk1.5开始的一些新特性:静态导入,增强for循环,可变参数,自动装箱/拆箱,枚举类型
Jdk1.5新特性之静态导入 jdk1.5新特性值静态导入 静态导入的作用:简化缩写 静态导入的作用:可以作用一个类的所有静态成员. 静态导入的格式:import static 包名.类名.静态的成员 ...
- 增强for循环用法
1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的, 但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容.不能获取 ...
- 增强for循环赋值
增强for循环赋值 代码如下: double[] testList01 = new double[5]; java.util.Scanner sc = new java.util.Scanner(Sy ...
- java中的Iterator与增强for循环的效率比较
最近在优化代码时遇到了这个问题:Iterator与增强for循环到底哪个效率高?之前在学习的时候,好像记着老师说过遍历集合(如list)时,使用iterator好像正规一些,因为是专用的,但是运行效率 ...
随机推荐
- 选择列表中的列……无效,因为该列没有包含在聚合函数或 GROUP BY 子句中
今天用SQL Server尝试实现一个SQL语句的时候,报了如标题所示的错误,通过在百度里面搜索,并亲自动手实现,终于发现问题所在,现在把它记录下来. 语句如下: select [OrderID],[ ...
- ADSI Edit 工具
最近在弄.net的活动目录用到了工具ADSI Edit,网上找了点资料,一来自己记录下,二来分享给大家: 下载的压缩包里存在两个文件adsiedit.dll和adsiedit.msc 1.将adsie ...
- Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换)
前面以前介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这个方案直接对图像空间操作,操作简单.所以也是空间域滤波. 频域滤波说究竟终于可能是和空间域滤波实现相同的功 ...
- C/C++,从未过时的编程语言之父
C/C++,持续火爆的编程语言之父 --訪传智播客C/C++学院院长传智·萧峰 编程语言作为实现互联网+基础必备工具,构建着互联网行业美轮美奂的大时代.作为编程语言之父--C语言,更是如鱼得水,在甘愿 ...
- js数组去重。。(拷的别人代码)
function unique(arr) { var result = [], hash = {}; for (var i = 0, elem; (elem = arr[i]) != null; i+ ...
- MVC后台与前台交互的问题。。。
后台: viewbag.sb/*这是一个sb路径*/=@"\gao\shou"; 前台js: var sb='@viewbag.sb'; alert(sb); 结果就是gaocon ...
- bootstrap+PHP表单验证
来源:http://www.sucaihuo.com/php/1814.html demo http://www.sucaihuo.com/jquery/18/1814/demo/
- 消息中间件-ActiveMQ入门实例
1.下载ActiveMQ: http://activemq.apache.org/download-archives.html 2.运行ActiveMQ 解压缩apache-activemq-5.5. ...
- LR通用的性能分析流程
Step1:从分析Summary的事务执行情况入手Summary主要是判定事务的响应时间与执行情况是否合理.如果发现问题,则需要做进一步分析.通常情况下,如果事务执行情况失败或响应时间过长等,都需要做 ...
- Python学习笔记(一)——基本知识点
主要记录学习Python的历程和用于复习.查阅之用. 知识点: 数据类型(列表.元组.字典.集合) 帮助文档 函数(默认参数.可变参数.关键字参数.参数组合) 数据类型: 列表:list ...