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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CSDN技术头条

Spring 框架和 Tomcat 容器扩展接口揭秘

在 Spring 框架中,每个应用程序上下文(ApplicationContext)管理着一个 BeanFactory,BeanFactory 主要负责 Bea...

754
来自专栏xingoo, 一个梦想做发明家的程序员

Mybatis入门例子

Mybatis是轻量级的持久化框架,的确上手非常快. Mybatis大体上的思路就是由一个总的config文件配置全局的信息,比如mysql连接信息等。然...

1877
来自专栏技术墨客

Spring核心——FactoryBean 原

本文继续之前的2篇文章(BeanPostProcessor和BeanFactoryPostProcessor)介绍Ioc容器的功能扩展。

692
来自专栏代码世界

Python之面向对象二

面向对象的三大特性: 继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 pyt...

3447
来自专栏LinkedBear的个人空间

设计模式笔记(二)——模板方法模式 原

因为学生3没有抄完(而且抄的题目还写错了。。。),以至于之后要背书的时候怎么也背不对了。。。

622
来自专栏Java爬坑系列

【Java入门提高篇】Day1 抽象类

  基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分...

1716
来自专栏青枫的专栏

day33_Spring学习笔记_01

4 + 1:4个核心jar包(beans、core、context、expression)+ 1个依赖jar包(com.springsource.org.apa...

371
来自专栏javathings

Spring Boot 中,Json 数据传值方式

之前整理过一篇 Spring MVC 中的传值方式。《Spring MVC 传值方式总结》

586
来自专栏happyJared

使用Spring RestTemplate访问Rest服务

  上面这段是RestTemplate类中的简单介绍,RestTemplate是Spring3.0后开始提供的用于访问 Rest 服务的轻量级客户端,相较于传统...

781
来自专栏后端之路

从一行代码到Guava Joiner

背景 代码中的到处散乱着如下的代码 ? 开发到处拷贝粘贴导致,事实上某些情况下开发还需要处理最后一个分隔符 解决方案 StringBuilder Sonar给...

2377

扫码关注云+社区