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相关知识的文档,但个人觉得 ...
随机推荐
- axios的封装
function axios(options){ var promise = new Promise((resolve,reject)=>{ var xhr = null; if(window. ...
- 论文笔记【一】Chinese NER Using Lattice LSTM
论文:Chinese NER Using Lattice LSTM 论文链接:https://arxiv.org/abs/1805.02023 论文作者:Yue Zhang∗and Jie Yang∗ ...
- 【awk】提取文件第一列
生信数据文件一般是按列分开的,如果我们只想简单的提取一列而不是费尽周折写个程序提取哪一列的话,awk作为一个非常好用的文档处理工具,我们现在来简单看一下他的一些功能: awk '{print $1}' ...
- 4、Kafka命令行操作
Kafka命令行操作 1)查看当前服务器中的所有topic [test@ip101 kafka]$ bin/kafka-topics.sh --zookeeper ip101:2181 --list ...
- Docker Swarm 创建服务
Docker Swarm 创建服务 环境: 系统:Centos 7.4 x64 应用版本:Docker 18.09.0 管理节点:192.168.1.79 工作节点:192.168.1.78 工作节点 ...
- Python 缓存服务
缓存服务:mongodb.redis.memcache mongodb:早期的缓存系统,直接持久话,数据即存内存也同步到硬盘. redis:主流缓存系统,半持久化,默认存在内存,需要手动调用存在硬盘, ...
- POJ3090 Visible Lattice Points
/* * POJ3090 Visible Lattice Points * 欧拉函数 */ #include<cstdio> using namespace std; int C,N; / ...
- please select android sdk(出现小红叉)
问题原因: 在项目中通过 git 协同开发,项目是 kotlin 与 Java 混合开发.在 build.gradle 中添加依赖之后就出现这个问题了,点击运行无法编译. 在网上找了各种解决办法都没能 ...
- 面试官让你讲讲acks参数对消息持久化的影响
(0)写在前面 面试大厂时,一旦简历上写了Kafka,几乎必然会被问到一个问题:说说acks参数对消息持久化的影响? 这个acks参数在kafka的使用中,是非常核心以及关键的一个参数,决定了很多东西 ...
- leecode第二百零六题(反转链表)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...