package org.rx.common;

import java.lang.reflect.Array;
import java.util.*; /**
* Created by wangxiaoming on 2016/3/3.
* https://msdn.microsoft.com/en-us/library/bb738550(v=vs.110).aspx
*/
public class NQuery<T> implements Iterable<T> {
//region Properties
private List<T> current; public NQuery(T[] set) {
if (set == null) {
throw new IllegalArgumentException("set == null");
}
current = Arrays.asList(set);
} public NQuery(Iterable<T> set) {
if (set == null) {
throw new IllegalArgumentException("set == null");
}
current = toList(set);
} private NQuery(List<T> list) {
current = list;
}
//endregion //region Methods
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private int offset; @Override
public boolean hasNext() {
return current.size() > offset;
} @Override
public T next() {
return current.get(offset++);
} @Override
public void remove() { }
};
} private List<T> toList(Iterable<T> set) {
List<T> list = new ArrayList<>();
for (T t : set) {
list.add(t);
}
return list;
}
//endregion //region PRMethods
public NQuery<T> where(Func<T, Boolean> selector) {
List<T> result = new ArrayList<>();
for (T t : current) {
if (selector.invoke(t)) {
result.add(t);
}
}
return new NQuery<>(result);
} public <TR> NQuery<TR> select(Func<T, TR> selector) {
List<TR> result = new ArrayList<>();
for (T t : current) {
result.add(selector.invoke(t));
}
return new NQuery<>(result);
} public <TR> NQuery<TR> selectMany(Func<T, Iterable<TR>> selector) {
List<TR> result = new ArrayList<>();
for (T t : current) {
for (TR tr : selector.invoke(t)) {
result.add(tr);
}
}
return new NQuery<>(result);
}
//endregion //region JoinMethods
public <TI, TR> NQuery<TR> join(Iterable<TI> inner, BiFunc<T, TI, Boolean> keySelector,
BiFunc<T, TI, TR> resultSelector) {
List<TR> result = new ArrayList<>();
for (T t : current) {
for (TI ti : inner) {
if (!keySelector.invoke(t, ti)) {
continue;
}
result.add(resultSelector.invoke(t, ti));
}
}
return new NQuery<>(result);
}
//endregion //region SetMethods
public boolean any() {
return current.size() > 0;
} public boolean any(Func<T, Boolean> selector) {
return this.where(selector).any();
} public NQuery<T> except(Iterable<T> set) {
List<T> result = toList();
for (T t : set) {
result.remove(t);
}
return new NQuery<>(result);
} public NQuery<T> intersect(Iterable<T> set) {
List<T> result = toList();
result.retainAll(toList(set));
return new NQuery<>(result);
} public NQuery<T> union(Iterable<T> set) {
HashSet<T> result = new HashSet<>();
result.addAll(current);
result.addAll(toList(set));
return new NQuery<>(result);
}
//endregion //region OrderingMethods
public <TK> NQuery<T> orderBy(final Func<T, TK> keySelector) {
List<T> result = toList();
Collections.sort(result, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
TK tk = keySelector.invoke(o1);
if (!Comparable.class.isAssignableFrom(tk.getClass())) {
return 0;
}
Comparable c = (Comparable) tk;
return c.compareTo(keySelector.invoke(o2));
}
});
return new NQuery<>(result);
} public <TK> NQuery<T> orderByDescending(final Func<T, TK> keySelector) {
List<T> result = toList();
Collections.sort(result, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
TK tk = keySelector.invoke(o1);
if (!Comparable.class.isAssignableFrom(tk.getClass())) {
return 0;
}
Comparable c = (Comparable) tk;
int val = c.compareTo(keySelector.invoke(o2));
if (val == 1) {
return -1;
} else if (val == -1) {
return 1;
}
return val;
}
});
return new NQuery<>(result);
}
//endregion //region GroupingMethods
public <TK, TR> NQuery<TR> groupBy(Func<T, TK> keySelector, Func<Tuple<TK, NQuery<T>>, TR> resultSelector) {
Map<TK, List<T>> map = new HashMap<>();
for (T t : current) {
TK key = keySelector.invoke(t);
if (map.get(key) == null) {
map.put(key, new ArrayList<T>());
}
map.get(key).add(t);
}
List<TR> result = new ArrayList<>();
for (TK tk : map.keySet()) {
result.add(resultSelector.invoke(Tuple.of(tk, new NQuery<>(map.get(tk)))));
}
return new NQuery<>(result);
}
//endregion //region AggregateMethods
public int count() {
return current.size();
}
//endregion //region PagingMethods
public T first() {
return current.get(0);
} public T firstOrDefault() {
if (current.size() == 0) {
return null;
}
return first();
} public T last() {
return current.get(current.size() - 1);
} public T lastOrDefault() {
if (current.size() == 0) {
return null;
}
return last();
}
//endregion //region ToMethods
public T[] toArray(Class<T> type) {
T[] set = (T[]) Array.newInstance(type, current.size());
current.toArray(set);
return set;
} public List<T> toList() {
return new ArrayList<>(current);
} public Set<T> toSet() {
return new HashSet<>(current);
} public <TK> Map<TK, T> toMap(Func<T, TK> keySelector) {
HashMap<TK, T> map = new HashMap<>();
for (T t : current) {
map.put(keySelector.invoke(t), t);
}
return map;
} public <TK, TV> Map<TK, TV> toMap(Func<T, TK> keySelector, Func<T, TV> valueSelector) {
HashMap<TK, TV> map = new HashMap<>();
for (T t : current) {
map.put(keySelector.invoke(t), valueSelector.invoke(t));
}
return map;
}
//endregion
}
package org.rx.common;

public interface BiFunc<T1, T2, T3> {
T3 invoke(T1 arg1, T2 arg2);
}

Java 1.7 NQuery的更多相关文章

  1. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  2. java LRUCache

    package org.rx.cache; import org.rx.common.*; import org.rx.beans.DateTime; import java.util.Collect ...

  3. Java EntityMapper

    package org.rx.util; import org.rx.common.Func2; import org.rx.common.Action2; import org.rx.common. ...

  4. java com.db4o 类

    <!--juan_zhai--> <dependency> <groupId>com.db4o</groupId> <artifactId> ...

  5. Java BIO socket

    package org.rx.socks; import lombok.extern.slf4j.Slf4j; import org.rx.core.LogWriter; import org.rx. ...

  6. java 简单 SocketPool

    package org.rx.socks; import lombok.extern.slf4j.Slf4j; import org.rx.common.LogWriter; import org.r ...

  7. java Logger 类

    package org.rx.common; import org.slf4j.LoggerFactory; import java.util.Collections; import java.uti ...

  8. 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题

    背景起因: 记起以前的另一次也是关于内存的调优分享下   有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...

  9. Elasticsearch之java的基本操作一

    摘要   接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...

随机推荐

  1. RXD, tree and sequence IN HDU6065

    解这道题绕了好多弯路...先是把"depth of the least common ancestor"这句话忽视掉,以为是最深点与最浅点的深度差:看到某人题解(的开头)之后发现自 ...

  2. 从路由器镜像中提取uImage头信息

    uImage header为64字节,文件头为27 05 19 56 hexdump -C a.bin | grep "27 05 19 56" 或者 hd aa.bin | gr ...

  3. python from entry to abandon2

    学习Linux已经有大致两周了,依然感觉到自己仍然在运维的大门外徘徊.于是我想要找到一个在Linux之外的业余方向,可以以作为枯燥基础学习的调节.没过多久我就发现了Python可以说是钦定的选择,它作 ...

  4. Learning-Python【27】:异常处理

    一.错误与异常 程序中难免会出现错误,而错误分为两种 1.语法错误:这种错误,根本过不了 Python 解释器的语法检测,必须在程序执行前就改正 2.逻辑错误:比如用户输入的不合适等一系列错误 那什么 ...

  5. Learning-MySQL【5】:数据的操作管理

    一.插入数据 1.为表的所有字段插入数据 通常情况下,插入的新纪录要包含表的所有字段 INSERT 语句有两种方式可以同时为表的所有字段插入数据,第一种方式是不指定具体的字段名,第二种方式是列出表的所 ...

  6. BOM简介

    BOM简介 BOM Browser Object Model 浏览器对象模型 // 通过window对象来访问浏览器 console.log(window.document); // frames:当 ...

  7. Vue常见组件

    每一个组件都是一个vue实例 每个组件均具有自身的模板template,根组件的模板就是挂载点 每个组件模板只能拥有一个根标签 子组件的数据具有作用域,以达到组件的复用 根组件 <div id= ...

  8. es6 class的基本语法

    ES5以及之前的版本,没有类的概念,但是聪明的JavaScript开发者,为了实现面向对象,创建了特殊的近类结构. ES5中创建类的方法:新建一个构造函数,定义一个方法并且赋值给构造函数的原型. 'u ...

  9. Springboot解决war包放到Tomcat服务器上404的特殊情况

    Springboot解决war包放到Tomcat服务器上404的特殊情况 原文链接:https://www.cnblogs.com/blog5277/p/9330577.html 原文作者:博客园-- ...

  10. NodeJS:(一)特性&环境&测试

    特性: ①非阻塞I/O,事件驱动,单线程 非阻塞I/O:进程不等I/O完成(阻塞是等I/O完成后才进行下一步) 事件驱动:异步操作结束后通知 ②优点 前端职责范围变大,统一开发体验 处理高并发(单位时 ...