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三个 ...
随机推荐
- TechnoSoftware OPCDA client(1.2.1) Error Codes
OPCDA.NET Client Interface WrapperSummary of OPC Error Codes We have attempted to minimize the numbe ...
- 通过flask实现web页面简单的增删改查bootstrap美化版
通过flask实现web页面简单的增删改查bootstrap美化版 项目目录结构 [root@node1 python]# tree -L 2 . ├── animate.css ├── fileut ...
- 通过flask实现web页面简单的增删改查
通过flask实现web页面简单的增删改查 # 1.后台程序falsk_web01.py #coding:utf-8 from flask import Flask,render_template,r ...
- redis conf 中文详解
# Redis示例配置文件 # 注意单位问题:当需要设置内存大小的时候,可以使用类似1k.5GB.4M这样的常见格式: # # 1k => 1000 bytes # 1kb => 1024 ...
- Vue - Router 路由
路由的注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- Ex 2_27 矩阵A的平方是A自乘后的乘积,即AA..._第三次作业
- [C]内存管理、内存泄露、堆栈
原文地址:https://www.cnblogs.com/youthshouting/p/4280543.html,转载请注明源地址. 1.内存分配区间: 对于一个C语言程序而言,内存 ...
- 如何使用Jquery直接导入记事本的内容
直接上代码 <!DOCTYPE html> <html> <head> <title> </title> </head> < ...
- 整合 JIRA 和 Confluence 6
Jira 应用和 Confluence 可以完全的整合在一起.在 Confluence 中收集你项目组成员的想法,知识和计划.在 Jira 中跟踪你的系统出现的问题,让这 2 个应用同时工作. 了解更 ...
- Swift 通过字符串创建控制器
由于Swift 中新增了一个命名空间(在同一个命名空间中的文件可以直接访问而不用引入头文件)的概念 所以通过字符串创建控制器需要带上命名空间 1 首先为Bundle 写一个分类 获取命名空间 ext ...