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. [antd-design-pro] mock 数据(post,request不一致)Sorry, we need js to run correctly!

    Sorry, we need js to run correctly! 可能问题: mock数据 api  和  request  api 不一致 'POST /api/banners/left'   ...

  2. 20190404用户及用户组管理(week1_day4)

    useradd userdel usermod groupadd groupdel 用户管理 为什么需要有用户? 1. linux是一个多用户系统 2. 权限管理(权限最小化) 用户:存在的目录是为了 ...

  3. 0.2:Game and Art

    文章著作权归作者所有.转载请联系作者,并在文中注明出处,给出原文链接. 本系列原更新于作者的github博客,这里给出链接. 通过上一节的学习,我们对游戏美术和游戏开发已经有了比较基本的了解.那么,该 ...

  4. MySQL8.0 优化

    参考 https://dev.mysql.com/doc/refman/8.0/en/insert-optimization.html https://dev.mysql.com/doc/refman ...

  5. Linux 系统开启随机端口数量 调优

    Linux系统随机端口 默认Linux系统开启的随机端口范围为 32768 ~ 65535.客户端连接服务监听端口需要使用到随机端口连接. Linux系统随机端口调优 1.添加内核配置参数:/etc/ ...

  6. StringUtils工具类常用方法汇总(判空、转换、移除、替换、反转)

    Apache commons lang3包下的StringUtils工具类中封装了一些字符串操作的方法,非常实用,使用起来也非常方便.最近自己也经常在项目中使用到了里面的一些方法,在这里将常用的方法总 ...

  7. [C++ Primer Plus] 零散知识点(一)、输入函数(cin,cin.get,cin.getline等)+string头文件辨析

    本文几乎照搬http://www.cnblogs.com/luolizhi/p/5746775.html博客,只修改了一点点.不知道怎么转发过来,尴尬... 学C++的时候,这几个输入函数弄的有点迷糊 ...

  8. Android创建自定义的布局和控件

    Android的自带布局有framelayout.linerlayout.relativelayout,外加两个百分比布局,但是这些无法灵活的满足我们的需要,所以我们要自己自定义并引入自己的布局.首先 ...

  9. MapReduce编程:平均成绩

    问题描述 现在有三个文件分别代表学生的各科成绩,编程求各位同学的平均成绩.                     编程思想 map函数将姓名作为key,成绩作为value输出,reduce根据key ...

  10. php搜索附近人及显示男生女生分开

    // 滚动切换标签样式 switchTab: function (e) { this.setData({ currentTab: e.detail.current }); this.checkCor( ...