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 条评论
登录 后参与评论

相关文章

来自专栏草根专栏

使用 dynamic 类型让 ASP.NET Core 实现 HATEOAS 结构的 RESTful API

上一篇写的是使用静态基类方法的实现步骤: http://www.cnblogs.com/cgzl/p/8726805.html 使用dynamic (Expa...

4526
来自专栏积累沉淀

Hadoop--倒排索引过程详解

倒排索引就是根据单词内容来查找文档的方式,由于不是根据文档来确定文档所包含的内容,进行了相反的操作,所以被称为倒排索引 下面来看一个例子来理解什么是倒排索引 这...

2779
来自专栏十月梦想

js二维数组遍历

712
来自专栏专知

【关关的刷题日记56】Leetcode 107 Binary Tree Level Order Traversal II

关关的刷题日记56 – Leetcode 107 Binary Tree Level Order Traversal II 题目 ? 题目的意思是让我们按照二叉...

3358
来自专栏恰同学骚年

剑指Offer面试题:27.最小的k个数

  这道题是典型的TopK问题,其最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数。这种思路的时间复杂度是O(nlogn),但...

602
来自专栏待你如初见

JavaIO流输入输出流-字符流

691
来自专栏专知

关关的刷题日记77 – Leetcode 203.Remove Linked List Elements

关关的刷题日记77 – Leetcode 203.Remove Linked List Elements 题目 Remove all elements from...

3338
来自专栏计算机视觉与深度学习基础

基于hadoop的社交网络三角形计数

图的三角形计数问题是一个基本的图计算问题,是很多复杂网络分析(比如社交网络分析) 的基础。目前图的三角形计数问题已经成为了 Spark 系统中 GraphX 图...

2095
来自专栏专知

【关关的刷题日记59】Leetcode 257 Binary Tree Paths

关关的刷题日记59 – Leetcode 257 Binary Tree Paths 题目 ? 题目要求我们给出所有根节点到叶子节点的路径。 思路 思路:求一棵...

3287
来自专栏Ceph对象存储方案

查询bucket已用量脚本-python

目前仅支持ceph的s3方案,具体配置看说明 # -*- coding: utf-8 -*- import requests import json from ...

2009

扫描关注云+社区