目前支持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常用函数的更多相关文章

  1. java 多线程总结篇2之——Thread类及常用函数

    此片文章主要总结的是Thread类及相关的基础概念和API,首先需要厘清线程调度中的几个基本概念: 一.线程调度的基本方法 1.调整线程优先级:Java线程有优先级,优先级高的线程会获得较多的运行机会 ...

  2. java基础--常用函数总结

    java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.flo ...

  3. Java学习:常用函数接口

    常用函数接口 什么是函数式接口? 函数式接口,@FunctionalInterface,简称FI,简单的说,FI就是指仅含有一个抽象方法的接口,以@Functionalnterface标注 注意:这里 ...

  4. Java中math类的常用函数

    Java中math类的常用函数 在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数.对数.平方根和三角函数等 只要在源文件的顶部加上下面这行代码就不必在数学方法名和常量名 ...

  5. 如果你也会C#,那不妨了解下F#(4):了解函数及常用函数

    函数式编程其实就是按照数学上的函数运算思想来实现计算机上的运算.虽然我们不需要深入了解数学函数的知识,但应该清楚函数式编程的基础是来自于数学. 例如数学函数\(f(x) = x^2+x\),并没有指定 ...

  6. C#string常用函数总结

    补充:             1:在C语言里 char占1个字节 而在C#,Java里char占两个字节 数据库里char 中汉占两个字节 字母数字占一个字             2:string ...

  7. 【转】JNI学习积累之一 ---- 常用函数大全

    原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjun ...

  8. salesforce 零基础学习(六十六)VF页面应善于使用变量和函数(二)常用函数的使用

    上一篇介绍VF中常用的变量,此篇主要内容为VF页面可以直接使用的函数,主要包括Date相关函数,Text相关函数,Information相关函数以及logic相关函数,其他相关函数,比如math相关函 ...

  9. PHP常用函数(一):数组常用函数

    1.list() list() 和 array() 一样,不是一个函数,而是一个语言结构,作用是为一组变量赋值.  PHP手册中的介绍 使用详情 <?php //假设现在想为$a $b $c三个 ...

随机推荐

  1. 在operator =中要处理“自我赋值”

    防止自我赋值很有必要 Widget w; w = w; a[i] = a[j]; //a[i]和a[j]实际上指向同一个元素 *pi = *pj; //pi和pj实际上指向同一个元素 自我赋值的危害: ...

  2. Linux中OCI开发库的配置

    Oracle调用接口(Oracle Call Interface,简称OCI)提供了一组可对Oracle数据库进行存取的接口子例程(函数),通过在第三代程序设计语言(如C语言)中进行调用可达到存取Or ...

  3. This project is not a myeclipse hibernate project . Assuming Hibernate 3 capabilities configuration editor

    开某工程Hibernate配置文件时出现提示,信息大概如标题. 根据网友提供,选中工程,点击MyEclipse-->Project capabilities-->add hibernate ...

  4. PHP导出MySQL数据字典 Summer-Mysql-Dic

    2017年11月9日09:30:29 用 PHP 写的一个类文件, 用来导出MySQL数据字典 导出表信息; 字段信息, 索引信息 可以导出浏览器适用的样式, 也可以导出word文档 建议上线前用这个 ...

  5. how to get address of member function

    see:http://www.cplusplus.com/forum/general/136410/ & http://stackoverflow.com/questions/8121320/ ...

  6. signal & slot

    The Qt signals/slots and property system are based on the ability to introspect the objects at runti ...

  7. python old six day

    今天主要内容: . is 和== 的区别 . 编程的问题 一.       is和==的区别! is  比较的是内存地址 ==  比较的是值 记住结果就好 ⑴id 通过id() 我们查看到一个变量表示 ...

  8. mysql修改字段长度及pymysql.err.DataError: (1406, "Data too long for column 'name' at row 1")错误

    文章链接:修改字段:https://blog.csdn.net/xiejunna/article/details/78580682 错误分析:https://blog.csdn.net/qq_4214 ...

  9. Sql 08数据库还原数据库时一直提示数据库被占用

    直接试试这个sql语句吧 ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE ALTER database [datebase] ...

  10. BeautifulSoup解析器的选择

    BeautifulSoup解析器 在我们使用BeautifulSoup的时候,选择怎样的解析器是至关重要的.使用不同的解析器有可能会出现不同的结果! 今天遇到一个坑,在解析某html的时候.使用htm ...