好用java库(二) : lambdaj (集合操作)
接着介绍另外一个好用的java库。
记得之前做过一个web services,业务逻辑是很简单,可是代码写得多又长,因为基本上都是在对ArrayList结果进行各种筛选,排序,聚合等操作。大家都有这样的感觉,这样的代码写起来洋洋洒洒不觉得累,反正都是集合的循环操作不用动脑子,边看着微博边写代码都行,可是看的人就苦逼了,大循环嵌套小循环,半天找不到一句有用的「业务」描述性提示,你还不得不细心着看半天才知道原来是对集合做一些简单操作。
lambdaJ 就是这样的针对这样的一个编程上下文场景而出来的,懒惰的聪明人最可能会写出一个个好用的工具(说到「工具」,今天买了本「打造Facebook」,里面就提到了facebook公司的工具文化)来。
The best way to understand what lambdaj does and how it works is to start asking why we felt the need to develop it:
- We were on a project with a complex data model
- The biggest part of our business logic did almost always the same: iterating over collections of our business objects in order to do the same set of tasks
- Loops (especially when nested or mixed with conditions) are harder to be read than to be written
- We wanted to write our business logic in a less technical and closer to business fashion
--在javaone 2010会议上,lambdJ演讲中PPT描述为什么lambdJ会开发出来
「我希望我们写的代码能让业务员都能看懂」,我是这样理解上面引用表达的内容的。
lambdJ提供了一个DSL的语法去对集合进行相关操作。DSL 就是 Domain specific Language,精髓在「Domain」一词,「领域业务专门语言」,就是特定一个业务领域所专有的语言形式。比如我们所熟悉的SQL语言,就是一门DSL语言,它是专门针对数据库操作的语言。那lambdJ就是一个专门针对「集合」操作的DSL语言。
下面我们就要看下如果使用它:
我们先定义一个类,它将会被我们要操作的集合对象包含。
public class Person implements Serializable{private static final long serialVersionUID = -5626560607865508210L;private int id;private String name;private int age; }//初始化一个集体对象 List<Person> persons = new ArrayList<Person>();Person p = new Person(); p.setId(1); p.setName("张三"); p.setAge(28); persons.add(p); p = new Person(); p.setId(2); p.setName("李四"); p.setAge(35); persons.add(p);
joinFrom(连接字段)
String names = joinFrom(persons).getName();//output:张三, 李四
还可以自定义拼接符
String names = joinFrom(persons,"--").getName();//output: 张三--李四
select(条件选择)
//筛选出年龄大于33岁的人 List<Person> ageGreaterThan33 = select(persons,having(on(Person.class).getAge(),Matchers.greaterThan(33)));
selectMax,selectMin(最大/最小 对象)
Person personWithMaxAge = selectMax(persons, on(Person.class).getAge());//得到年龄最大的人
max,min(最大/最小 对象属性值)
int maxAge = max(persons, on(Person.class).getAge());//获得集合中年龄最大的那个值
maxFrom,minFrom(和max,min功能一样)
int maxAge = maxFrom(persons).getAge();//获得集合中年龄最大的那个值,和上面的max一样功能,形式不同而也
sum,sunFrom(求和)
int ageSum = sumFrom(persons).getAge(); int ageSum = sum(persons, on(Person.class).getAge());
sort(排序)
List<Person> sortByAge = sort(persons, on(Person.class).getAge());
extract(抽取字段属性组成集合)
List<Integer> ageList = extract(persons, on(Person.class).getAge());
index(以某字字段属性为关键值分组)
Map<String,Person> mapByName = index(persons, on(Person.class).getName());
我这里写的都是很简单的例子,详细的功能介绍请查看官网上的ppt。总之只有你想不到,没有它做不到的集合操作功能。
还有,如果大家在工作中遇到很变态的集合操作而不知道怎么写时(就像很复杂的sql写法时),可以在这里留言我们一起讨论学习下。
转载于:https://www.cnblogs.com/jcli/archive/2013/01/09/2851906.html
好用java库(二) : lambdaj (集合操作)相关推荐
- 【java】java 8 的一些集合操作
1.概述 转载并且补充:java8 stream的这些开发技巧,你值得好好收藏 2.stream的继承关系 stream的继承关系 Stream.IntStream.LongStream.Double ...
- java提供的对集合操作的常用方法,并集,交集,差集
差集和并集 控制台打印: 交集 @Testpublic void testIntersection(){List<String> a = new ArrayList<String&g ...
- 读书笔记-《ON JAVA 中文版》-摘要12[第十二章 集合]
文章目录 第十二章 集合 1. 泛型和类型安全的集合 2. 基本概念 3. 添加元素组 4. 集合的打印 5. 列表List 6. 迭代器Iterators 6.1 Iterators 6.2 Lis ...
- java 集合操作_Java 集合的操作 个人方法总结
一些小建议: 在使用集合的时候如果不太清楚需求我们可以像对列一样如下: Queue expres=new ArrayDeque<>(); 重新指定类型,来进行更换 Queue expres ...
- Java基础(二):集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举
Java基础(一):编译和解释.数据类型.变量作用域.String常用方法.数组.面向对象.异常 Java基础(二):集合.IO流(Zip压缩输入/输出流等).File文件类.反射.枚举 Java异常 ...
- java List最大_在java中获取List集合中最大的日期时间操作
取list集合中最大的日期, 可以用date max = collections.max(datelist);, 传入一个日期集合, 就可以获取, 工作中有这个需求, 就查找到这个, 代码如下 } e ...
- java stream 8 常用的操作集合 求和 排序 过滤 拿出对象元素组成集合
举个例子拿一个教师给学生开家长会Java实体 解释 stream 流操作集合建立在内存之上非常的快 以下列举 常用的操作方法 @Data public class OpenClass {private ...
- 2019年3月未来教育计算机二级题库,2019年3月计算机二Access考试操作模拟试题001...
2019年3月计算机二Access考试操作模拟试题001 浏览次数: 时间:2019/03/28 一.基本操作题 在考生文件夹中有一个"Acc1.mdb"数据库. (1)在 ...
- java集合操作-----求两个集合的交集和并集
java求两个集合的交集和并集 java如何求两个集合的交集和并集呢??其实java的API中已经封装了方法.今天写个简单的例子测试一下:(例子中以java.util.LinkedList为例) 求连 ...
最新文章
- python中字典的练习
- python3学哪个版本好玩_python2和python3到底应该学哪个好?
- 1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
- JavaScript强化教程——数组的基本处理函数
- 使用Kotlin的Android Spinner
- 如何实现现实人脸照片的编码
- win10鼠标灵敏度怎么调_和平精英,灵敏度到底怎么调?小编视频来教你!
- 三星手机官方固件下载
- 【FPGA基础】四位二进制--格雷码转换器(vivado)
- 不能错过!9个让你随时保持精力充沛的习惯
- 如何在React.js文件中设置标签的背景图片
- Qt 笔锋 钢笔 压力值
- Carson带你学Android:RxJava、Retrofit联合使用汇总(含实例教程)
- 数据结构与算法学习---数据结构篇(线性表)(默然回首,夯实基础)
- 软件工程毕业设计课题(78)微信小程序毕业设计PHP校园食堂就餐预约小程序系统设计与实现
- Vega Prime 常见问题集
- unity游戏优化之ETC压缩和 Alpha通道处理
- mysql函数名称顿号,快速统计一个单元格内有多少个名字,你不会是一个一个数的吧...
- 第一次独立使用大型无人船记录日志—第2天
- c罗python可视化分析_梅西、内马尔谁是全能的五边形战士?教你用BI做出可视化能力图...
热门文章
- python官网无法访问_python写的网站,云服务器经常无法访问
- 初入SysML之模块定义图
- (76)ila使用?
- (49)VHDL实现8位奇偶校验电路(while loop语句)
- (20)FPGA数据接口同步化
- 360浏览器支持ajax吗,请问IE11,chrome,360浏览器7.1极速等这些浏览器不支持ajax技术吗?...
- java接听电话freeswitch_java通过http协议与Freeswitch对接实现动态添加用户
- 1018.eclipse工具使用记录
- 【Keil】使用Keil5时出现的错误(持续更新)
- 【好文链接】从原理上搞懂PID