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. 高度自适应不能触发transition的解决方法

    1. 前言  在我们不能确定一个元素的高度的时候,要使用transition过渡,是不会触发的,比如一个p标签 内容行数不固定  我们可能就要初始 height: 0 ; 过渡到 height: au ...

  2. java面试题汇总(有的题无视即可,没什么实际用途)

    相关概念 面向对象的三个特征 封装,继承,多态,这个应该是人人皆知,有时候也会加上抽象. 多态的好处 允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消 ...

  3. 配置firewalld端口转发

    题:在系统 system1 设定端口转发,要求: 1.在172.24.8.0/24网络中的系统,访问system1的本地端口 5423 将被转发到 80 2.此设置必须永久有效 答: # 配置转发端口 ...

  4. ps | grep排除grep这个进程

    我们经常用ps | grep xxx来查询是否存在某进程,但默认情况下会将grep这个命令也作为结果返回,这样无论是否存在查询的进程,该命令的返回值都是0. 要避免这种情况可以使用grep的-v参数, ...

  5. D1图论最短路专题

    第一题:poj3660 其实是Floyed算法的拓展:Floyd-Wareshall.初始时,若两头牛关系确定则fij = 1. 对于一头牛若确定的关系=n-1,这说明这头牛的排名是确定的. 通过寻找 ...

  6. svn版本备份和恢复注意事项

    转帖的,因为我经常要用到,所以也在我的博客上记录一下:  注意:备份不备份日志,你想备份日志就要单独在客户端备了,具体步骤百度上都有 svn备份常用命令1.完全备份和增量备份svn.svnadmin  ...

  7. Jenkins安装及配置

    Jenkins 简介 Jenkins 是一个开源项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.它的功能包括: 1.持续的 ...

  8. [福建集训2011][LOJ10111]相框

    这题主要还是分类讨论欧拉回路 首先对于导线一端没有东西的新建一个节点 由于原图不一定连通所以需要用到并查集判断有多少个连通块 将一条导线连接的两个焊点连接 然后先对于只有一个连通块考虑 1.如果一个焊 ...

  9. 不错的redis文章

    参考: https://www.cnblogs.com/itdragon/tag/redis/

  10. element ui 上传图片

    upload在form模块,在demo的基础上包个form然后action写地址用?&拼接参数即可