Java LinqCollection 仿Linq的list常用函数
目前支持find,findAll,sort,select,remove等,java不支持lamda函数,因此用接口代替
public interface Fun<T1,T2> {
public T2 process(T1 item);
}
public interface Predicate<T> {
/**
* 是否满足
* @param item
* @return
*/
public boolean evaluate(T item);
}
接下来是具体的实现:
public class LinqCollection<T> extends java.util.ArrayList<T> {
/**
* serialVersionUID
*/
private static final long serialVersionUID = -5042194313851746204L;
public LinqCollection(){
super();
}
public LinqCollection(Collection<? extends T> c){
super(c);
}
/**
* 查找首条符合条件的记录
* @param predicate 条件
* @return
*/
public T find(Predicate<T> predicate){
for(T item: this){
if(predicate.evaluate(item)){
return item;
}
}
return null;
}
/**
* 按条件删除
* @param predicate
*/
public void remove(Predicate<T> predicate){
ListIterator<T> i = this.listIterator();
while(i.hasNext()){
T c = i.next();
if(predicate.evaluate(c)){
i.remove();
}
}
}
class ComparableItem<T> implements Comparable{
T data;
Fun<T, ?> keySelect =null;
public <T2 extends Comparable<? super T2>> ComparableItem(T item,Fun<T,T2> keySelect){
this.keySelect = keySelect;
this.data = item;
}
@Override
public int compareTo(Object o) {
return ((Comparable)(this.keySelect.process(this.data))).compareTo((Comparable)(this.keySelect.process(((ComparableItem<T>)o).data)));
}
}
/**
* 选择
* @param keySelect
* @return
*/
public <T2> LinqCollection<T2> select(Fun<T,T2> keySelect){
LinqCollection<T2> result = new LinqCollection<T2>();
for(T item : this){
result.add(keySelect.process(item));
}
return result;
}
/**
* 按指定字段排序
* @param keySelect(选择排序的字段)
*/
public <T2 extends Comparable<? super T2>> void sort(Fun<T,T2> keySelect){
List<ComparableItem<T>> items = Lists.newArrayList();
for(T item : this){
items.add(new ComparableItem<T>(item, keySelect));
}
Collections.sort(items);
ListIterator i = this.listIterator();
for (int j=0; j<items.size(); j++) {
i.next();
i.set(items.get(j).data);
}
}
/**
* 查找所有符合条件的记录
* @param predicate
* @return
*/
public LinqCollection<T> findAll(Predicate<T> predicate){
LinqCollection<T> result = new LinqCollection<T>();
for(T item: this){
if(predicate.evaluate(item)){
result.add(item);
}
}
return result;
}
/**
* 是否存在
* @param predicate
* @return
*/
public boolean exist(Predicate<T> predicate){
return this.find(predicate)!=null;
}
}
使用举例:
cleanItems.sort(new Fun<SameNameSinger, Integer>() {
@Override
public Integer process(SameNameSinger item) {
return item.getNameIndex();
}
});
Java LinqCollection 仿Linq的list常用函数的更多相关文章
- java 多线程总结篇2之——Thread类及常用函数
此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...
- java基础--常用函数总结
java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.flo ...
- Java学习:常用函数接口
常用函数接口 什么是函数式接口? 函数式接口,@FunctionalInterface,简称FI,简单的说,FI就是指仅含有一个抽象方法的接口,以@Functionalnterface标注 注意:这里 ...
- Java中math类的常用函数
Java中math类的常用函数 在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数.对数.平方根和三角函数等 只要在源文件的顶部加上下面这行代码就不必在数学方法名和常量名 ...
- 如果你也会C#,那不妨了解下F#(4):了解函数及常用函数
函数式编程其实就是按照数学上的函数运算思想来实现计算机上的运算.虽然我们不需要深入了解数学函数的知识,但应该清楚函数式编程的基础是来自于数学. 例如数学函数\(f(x) = x^2+x\),并没有指定 ...
- C#string常用函数总结
补充: 1:在C语言里 char占1个字节 而在C#,Java里char占两个字节 数据库里char 中汉占两个字节 字母数字占一个字 2:string ...
- 【转】JNI学习积累之一 ---- 常用函数大全
原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...
- salesforce 零基础学习(六十六)VF页面应善于使用变量和函数(二)常用函数的使用
上一篇介绍VF中常用的变量,此篇主要内容为VF页面可以直接使用的函数,主要包括Date相关函数,Text相关函数,Information相关函数以及logic相关函数,其他相关函数,比如math相关函 ...
- PHP常用函数(一):数组常用函数
1.list() list() 和 array() 一样,不是一个函数,而是一个语言结构,作用是为一组变量赋值. PHP手册中的介绍 使用详情 <?php //假设现在想为$a $b $c三个 ...
随机推荐
- 关于boost中enable_shared_from_this类的原理分析
首先要说明的一个问题是:如何安全地将this指针返回给调用者.一般来说,我们不能直接将this指针返回.想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变 ...
- Apollo 框架的剖析1
百度Apollo 自动驾驶开源模块分析 从今天开始研究学习apollo的源码,apollo 3.0源码. apollo 3.0的系统框图 文件目录简介 apollo根目录 ├── .github/IS ...
- python beautifulsoup爬虫学习
BeautifulSoup(page_html, "lxml").select(),这里可以通过浏览器开发者模式选择copy selector,并且并不需要完整路径. github ...
- vue el-tree:默认展开第几级节点
需求描述: Tree 树形结构,默认展开第二级菜单. 查 element 文档: 解决方法: 设置 :default-expanded-keys 的值为 idArr 数组, <el-tree ...
- Windows 下搭建 SVN服务器及使用
目录 一 .安装Visual SVN 二.配置SVN 三.安装TortoiseSVN 四.上传项目到远程仓库 五.从远程仓库下载项目 六.检出项目 七.版本回退 参考链接 http://blog.cs ...
- springboot 文件上传大小配置
转自:https://blog.csdn.net/shi0299/article/details/69525848 springboot上传文件大小的配置有两种,一种是设置在配置文件里只有两行代码,一 ...
- AMQP消息队列之RabbitMQ简单示例
前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个 ...
- VI编辑器、ipython、jupyter及进程知识总结
一.VI编辑器 1.三种模式 一般模式(normal mode 默认) 插入模式(insert mode) 末行模式(last line mode) 2.模式切换 一般模式-------------- ...
- word在线预览编辑器
https://blog.csdn.net/liuli283/article/details/73776685 https://blog.csdn.net/mxljiayou/article/deta ...
- 修改 sql 提示符信息:
Last login: Thu Dec 8 19:18:08 2016 from 192.168.242.1 [root@localhost ~]# su - oracle [oracle@local ...