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();
				}
			});

  

 

时间: 2024-12-29 23:44:01

Java LinqCollection 仿Linq的list常用函数的相关文章

java报表工具FineReport常用函数的用法总结(文本和日期函数)

FineReport是比较常用的java报表开发工具,本文总结了常用函数中的文本和日期函数 文本函数 CHAR CHAR(number):根据指定数字返回对应的字符.CHAR函数可将计算机其他类型的数字代码转换为字符. Number:用于指定字符的数字,介于1Number:用于指定字符的数字,介于165535之间(包括1和65535). 示例: CHAR(88)等于"X". CHAR(45)等于"-". CODE CODE(text):计算文本串中第一个字符的数字代

java基础--常用函数总结

java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.floor( )舍掉小数取整数 3.Math.rint( )四舍五入取整数 4.Math.ceil( )进位取整数 5.IndexOf( )查找特定字符出现的索引 ----------------------------------------->特定字符出现的最先出现的位置:IndexOf(): ---

2015-8-25-关于后端的知识以及常用函数整理

首先结构一般是分为B/S(Browser/Server)和C/S(Client/Server)的,我们所用的是基于B/S结构的. 其中这里的B主要是一些控件的组成的页面,主要是由JScript控制的, 其中的S主要是由SSL代码控制的,又分为Server Script和Data Sources,首先来说说两者的一些区别(Server Script用SS代替,Data Sources用DS代替): 对于我们这个LIMS系统来说,最常用的操作就是对数据库的增.删.改.查,其中的“查”,也就是从数据库

Oracle数据库对表的基本操作和一些常用函数

首先,创建一个员工表,sql语句如下: CREATE TABLE employee( id NUMBER(4), name VARCHAR2(20) NOT NULL, gender CHAR(1) DEFAULT 'M', birth DATE, salary NUMBER(6,2), comn NUMBER(6,2), job VARCHAR2(30), manager NUMBER(4), deptno NUMBER(2) ) 下面,是对这个表的一些基本操作: RENAME employe

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

原文网址:http://blog.csdn.net/qinjuning/article/details/7595104 本文原创,转载请注明出处:http://blog.csdn.net/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 .心里想着该写点什么了?可是水平不够,再加上 包括很多真正实现地方--中间层,基本上没看.于是乎,也就不好卖

05 LINQ中的聚合函数Part-2

LINQ中的聚合函数最常用的有Sum(),Average(),Max(),Min().顾名思义,这些聚合函数分别用于获取记录集中的“总和”.“平均数”.“最大值”.“最小值”.这些函数的使用也非常简单,下面举例介绍. 1) Sum() List<int> intInList = new List<int>() { 1, 3, 3, 2, 7, 8, 4, 5, 6, 3, 9 }; int sumOfList = intInList.Sum(); Console.WriteLine

[转载]JNI学习积累之一 ---- 常用函数大全

本文转载于:http://blog.csdn.net/qinjuning 最近一段时间,在工作方面比较闲,分配的Bug不是很多,于是好好利用这段时间就着源代码看了些许模块, 主要方式 还是贼看贼看代码, 同时利用烧机的便利,加Log观看,基本上都能弄个脸熟 .心里想着该写点什么了?可是水平不够,再加上 包括很多真正实现地方--中间层,基本上没看.于是乎,也就不好卖弄了. 花了几天时间研究了下JNI,基本上知道如何使用了.照我的观点JNI还是不难的,难得只是我们一份尝试的心. 学习过程中, 发现关

NSString/NSMutableString常用函数

NSString / NSMutableString 字符串处理,常用代码 (实例) Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重新给这个字符串赋值.而NSMutableString 创建赋值以后可以动态在该字符串上更改内容与长度. NSString 常用方法总结 +(id)stringWithContentsOfFile:path enco

转战JS(1) 初探与变量类型、运算符、常用函数与转换

转战JS(1)初探与变量类型.运算符.常用函数与转换 做为一名.NET后台开发人员,正考滤向Web前端开发转型,之前也写过一代前端代码,可是当再回头看JS,并有转向它的意愿的时候,突然发现:原来JS不是那么简单的.很多的细节部分以前都没有注意到,现在把学习的知识点记录下来,做为学习笔记,好时不时看看.如果有什么错误,还请各位看官多多包涵.多多指正. JavaScript是一门轻量型的面向Web编程的脚本言语言,常被简称为:JS.广泛应用于PC和各种移动设备中,常和HTML.CSS一起组成网页页面