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好像正规一些,因为是专用的,但是运行效率 ...
随机推荐
- selenium测试(Java)--元素操作(五)
元素的操作有 1. 清除文本 2. 模拟按键输入 3. 单击元素 4. 返回元素尺寸 5. 获取文本 6. 获取属性值 7. 判断是否可见 8. 提交 下面通过操作新浪邮箱的注册界面的脚本来展示使用方 ...
- mac for appium环境安装
之前写过windows 安装appium环境步骤. 1. 需求的前置条件如下 (mac 自动git.ruby.brew命令): 2. java 环境 3. git 环境 4. ruby环境 5. b ...
- Qt Creater中Clang-format的使用
起因在于习惯性的想格式化代码,发现Qt Creater默认居然是没有代码格式化的,只有一个缩进,搞毛线啊!!! 搜索了下,倒是很容易就搜到了,Qt Creater中有个插件:beautifier,在 ...
- Spring零散所得
Spring容器中bean的id或name,都可以有多个,且第一个为标识符(Qualifier),其余皆为别名(Alias).所以都可以通过applicationContext.getBean(&qu ...
- RelativeLayout用代码兑现布局
RelativeLayout用代码实现布局TextView txt1 = new TextView(this); RelativeLayout.LayoutParams params = n ...
- HTC Desire 816刷机教程(图文)
HTC Desire 816刷机教程也来了,今天在这里主要是来说说如何刷机的,这个刷机是采用卡刷的方式,也就是利用第三方的recovery来刷入第三方的zip包,因为第三方的zip包都是支持卡刷的,很 ...
- 【Java面试题】58 char型变量中能不能存贮一个中文汉字?为什么?
char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么 ...
- jQuery-编辑选择结果(添加、筛选、过滤或检测)
编辑选择结果 操作 实例 效果 备注 添加 添加选择器 $("p").add(".a") 添加类名为a的选择器 并不影响源结果集 $(" ...
- XP 终端服务组件 恢复补丁包 terminal service patch
terminal 终端服务组件恢复包 下载地址(点击) winconnect server xp软件 下载地址(点击)
- MFC ADO数据库操作
MFC ADO数据库操作 - 延陵小明 - CSDN博客 http://blog.csdn.net/guoming0000/article/details/7280070/ 内容比较乱,作为草稿,对现 ...