Java 1.7 NQuery
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的更多相关文章
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- java LRUCache
package org.rx.cache; import org.rx.common.*; import org.rx.beans.DateTime; import java.util.Collect ...
- Java EntityMapper
package org.rx.util; import org.rx.common.Func2; import org.rx.common.Action2; import org.rx.common. ...
- java com.db4o 类
<!--juan_zhai--> <dependency> <groupId>com.db4o</groupId> <artifactId> ...
- Java BIO socket
package org.rx.socks; import lombok.extern.slf4j.Slf4j; import org.rx.core.LogWriter; import org.rx. ...
- java 简单 SocketPool
package org.rx.socks; import lombok.extern.slf4j.Slf4j; import org.rx.common.LogWriter; import org.r ...
- java Logger 类
package org.rx.common; import org.slf4j.LoggerFactory; import java.util.Collections; import java.uti ...
- 故障重现(内存篇2),JAVA内存不足导致频繁回收和swap引起的性能问题
背景起因: 记起以前的另一次也是关于内存的调优分享下 有个系统平时运行非常稳定运行(没经历过大并发考验),然而在一次活动后,人数并发一上来后,系统开始卡. 我按经验开始调优,在每个关键步骤的加入如 ...
- Elasticsearch之java的基本操作一
摘要 接触ElasticSearch已经有一段了.在这期间,遇到很多问题,但在最后自己的不断探索下解决了这些问题.看到网上或多或少的都有一些介绍ElasticSearch相关知识的文档,但个人觉得 ...
随机推荐
- mysql的一些指令
说起来mysql,mysql其实是特别简单操作的数据库.它有一下几方面的特点,亦或者是说优点,1,支持多语言:2.移植性比较好:3,我觉得最重要的一点就是它是开源的,因为开源,所以使用广泛,4.效率比 ...
- STM32的型号的命名规则
每种STM32的产品都由16个字母或数字构成的编号标示,用户向ST订货时必须使用这个编号指定需要的产品.这16个字符分为8个部分,下面通过一个例子说明它们的意义: STM32 F C T xxx ST ...
- 即时通讯(IV)
数据流
- matlab将rgb图转为灰度图的原理代码
MyYuanLaiPic = imread('e:/image/matlab/Cluo.jpg');%读取RGB格式的图像 MyFirstGrayPic = rgb2gray(MyYuanLaiPic ...
- lmbench用于arm测试
一.下载 http://www.bitmover.com/lmbench/lmbench.html网站有lmbench的介绍 下载地址如下(lmbench3): http://www.bitmover ...
- layui框架
layui框架 Fly社区/分享一个layui风格的grid.greegrid
- Maven提示找不到dependency依赖包
最近C盘爆炸,又重装了一下系统,打开之前创建的Maven项目,提示找不到仓库里的jar包了 我更新了Maven,重新加载都没用,我去系统盘查看的时候发现了这么一个情况: 我在装WIN10的时候用的是U ...
- Angular2 EventEmitter
可能你对EventEmitter还不太熟悉,不过别担心,它并不难.EventEmitter只是一个帮你实现观察者模式①的对象.也就是说,它是一个管理一系列订阅者并向其发布事件的对象.就是这么简单.来看 ...
- vue extend 的基本使用
vue.extend 局部注册 的应用2 请注意,extend创建的是一个组件构造器,而不是一个具体的组件实例.所以他不能直接在new Vue中这样使用: new Vue({components: f ...
- rocketmq ----> 学习笔记
官网:http://rocketmq.apache.org 1.环境搭建 准备: rocketmq-all-4.3.0-bin-release.zip 必须配置:JAVA_HOME=/home/rui ...