java 的 linq,不要再写令人讨厌的 for 了!
package com.ly.linq; import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator; public class Enm {
public static <T> ArrayList<T> notNull(Iterable<T> source) {
return where(source, new Pre<T>() {
@Override
public boolean check(T t) {
return t != null;
}
});
} public static <T> ArrayList<T> where(T[] ts, Pre<T> mapper) {
return where(toList(ts), mapper);
} public static <T> ArrayList<T> where(Iterable<T> source, Pre<T> mapper) {
ArrayList<T> r = new ArrayList<T>();
for (T t : source) {
if (mapper.check(t)) {
r.add(t);
}
}
return r;
} public static <T> String toString(T[] source, Object s) {
return toString(toList(source), s);
} public static <T> String toString(T[] source, Object s, FuncT<T, String> mapper) {
return toString(toList(source), s, mapper);
} public static <T> String toString(Iterable<T> source, Object s) {
return toString(source, s, null);
} public static <T> String toString(Iterable<T> source, Object spliter, FuncT<T, String> mapper) {
String s = spliter == null ? "" : spliter.toString();
StringBuilder sb = new StringBuilder();
for (T ti : source) {
String str = mapper == null ? ti.toString() : mapper.get(ti);
sb.append(str + s);
}
if (sb.length() > 0) {
sb.setLength(sb.length() - s.length());
return sb.toString();
} else {
return "";
}
} public static <T, TKey, TValue> HashMap<TKey, TValue> toHashMap(T[] ts, FuncT<T, Pair<TKey, TValue>> pair) {
return toHashMap(toList(ts), pair);
} public static <T, TKey, TValue> HashMap<TKey, TValue> toHashMap(Iterable<T> source, FuncT<T, Pair<TKey, TValue>> pair) {
HashMap<TKey, TValue> r = new HashMap<TKey, TValue>();
for (T t : source) {
Pair<TKey, TValue> p = pair.get(t);
r.put(p.getKey(), p.getValue());
}
return r;
} public static <T> ArrayList<T> toList(Iterable<T> source) {
ArrayList<T> r = new ArrayList<T>();
for (T t : source) {
r.add(t);
}
return r;
} public static <T> ArrayList<T> toList(T[] ts) {
ArrayList<T> r = new ArrayList<T>();
for (T t : ts) {
r.add(t);
}
return r;
} public static <T> ArrayList<T> except(Iterable<T> it0, Iterable<T> it1) {
ArrayList<T> r = new ArrayList<T>();
for (T t : it0) {
if (!r.contains(t)) {
r.add(t);
}
}
for (int i = r.size() - 1; i > -1; i--) {
T t = r.get(i);
if (contains(it1, t)) {
r.remove(t);
}
}
return r;
} public static <T> ArrayList<T> union(Iterable<T> it0, Iterable<T> it1) {
ArrayList<T> r = new ArrayList<T>();
for (T t : it0) {
if (!r.contains(t)) {
r.add(t);
}
}
for (T t : it1) {
if (!r.contains(t)) {
r.add(t);
}
}
return r;
} public static <T> ArrayList<T> intersect(Iterable<T> it0, Iterable<T> it1) {
ArrayList<T> r = new ArrayList<T>();
for (T t0 : it0) {
for (T t1 : it1) {
if (t0 == null) {
if (t1 == null) {
if (!r.contains(t0)) {
r.add(t0);
}
}
} else {
if (t0.equals(t1)) {
if (!r.contains(t0)) {
r.add(t0);
}
}
}
}
}
return r;
} public static <T0, T1, TOut> ArrayList<TOut> intersect(Class<TOut> outCls, Iterable<T0> it0, Iterable<T1> it1, FuncT<T0, TOut> mapper0, FuncT<T1, TOut> mapper1) {
ArrayList<TOut> r = new ArrayList<TOut>();
for (T0 t0 : it0) {
TOut t0out = mapper0.get(t0);
for (T1 t1 : it1) {
TOut t1out = mapper1.get(t1);
if (t0out == null) {
if (t1out == null) {
if (!r.contains(t0out)) {
r.add(null);
}
}
} else {
if (t0out.equals(t1out)) {
if (!r.contains(t0out)) {
r.add(t0out);
}
}
}
}
}
return r;
} public static <T> boolean existsIn(T t, T... ts) {
for (T t2 : ts) {
if (t.equals(t2)) {
return true;
}
}
return false;
} public static <T> boolean contains(Iterable<T> source, T target) {
for (T t : source) {
if (t == null) {
if (target == null) {
return true;
}
} else {
if (t.equals(target)) {
return true;
}
}
}
return false;
} public static <T> boolean any(Pre<T> pre, T t, T... ts) {
if (pre.check(t)) {
return true;
}
return any(toList(ts), pre);
} public static <T> boolean any(T[] ts, Pre<T> pre) {
return any(toList(ts), pre);
} public static <T> boolean any(Iterable<T> source, Pre<T> pre) {
for (T i : source) {
if (pre.check(i)) {
return true;
}
}
return false;
} public static <T> ArrayList<T> sort(ArrayList<T> source, FuncT<T, Integer> mapper) {
int[] indexes = sortIndexes(source, mapper);
ArrayList<T> r = new ArrayList<T>();
for (int i : indexes) {
r.add(source.get(i));
}
return r;
} public static <T> int[] sortIndexes(Iterable<T> source, FuncT<T, Integer> mapper) {
ArrayList<Integer> ints = new ArrayList<Integer>();
Iterator<T> it = source.iterator();
while (it.hasNext()) {
Integer integer = mapper.get(it.next());
ints.add(integer);
}
int[] r = new int[ints.size()];
for (int i = 0; i < r.length; i++) {
r[i] = ints.get(i);
}
return sortIndexes(r);
} public static <T> int[] sortIndexes(T[] source, FuncT<T, Integer> mapper) {
int[] ints = new int[source.length];
for (int i = 0; i < source.length; i++) {
ints[i] = mapper.get(source[i]);
}
return sortIndexes(ints);
} public static int[] sortIndexes(int[] source) {
ArrayList<Integer> decre = new ArrayList<Integer>();
for (int i : source) {
decre.add(i);
}
ArrayList<Integer> incre = new ArrayList<Integer>();
while (incre.size() < source.length) {
int s = 0;
int v = decre.get(0);
for (int i = 1; i < decre.size(); i++) {
int e = decre.get(i);
if (e < v) {
s = i;
v = e;
}
}
decre.remove(s);
for (int i = 0; i < source.length; i++) {
if (source[i] != v || incre.contains(i)) {
continue;
}
incre.add(i);
break;
}
}
int[] r = new int[incre.size()];
for (int i = 0; i < incre.size(); i++) {
r[i] = incre.get(i);
}
return r;
} public static <TIn, TOut> ArrayList<TOut> select(TIn[] source, FuncT<TIn, TOut> mapper) {
return select(toList(source), mapper);
} public static <TIn, TOut> ArrayList<TOut> select(Iterable<TIn> source, FuncT<TIn, TOut> mapper) {
ArrayList<TOut> r = new ArrayList<TOut>();
for (TIn ti : source) {
r.add(mapper.get(ti));
}
return r;
}
}
java 的 linq,不要再写令人讨厌的 for 了!的更多相关文章
- 再写一篇tps限流
再写一篇tps限流 各种限流算法的称呼 网上有很多文章介绍限流算法,但是对于这些算法的称呼与描述也是有点难以理解.不管那么多了.我先按我理解的维度梳理一下. 主要维度是:是正向计数还是反向计数.是定点 ...
- Java是否还能再辉煌十年?
目录 Java是否还能再辉煌十年? 一.前言 二.如今的Java语言 2.1 位居TIOBE榜首 2.2 革命性的语言 三.Java受到的挑战 3.1 后台服务器软件的语言竞争 3.1.1 Pytho ...
- 【优雅代码】04-1行代码完成多线程,别再写runnable了
[优雅代码]04-1行代码完成多线程,别再写runnable了 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮 ...
- JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了
JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了 代码示例 转自 https://docs.oracle.com/javase/tutorial/jdbc/o ...
- Atitit 实现java的linq 以及与stream api的比较
Atitit 实现java的linq 以及与stream api的比较 1.1. Linq 和stream api的关系,以及主要优缺点1 1.2. Linq 与stream api的适用场景1 1. ...
- java的LINQ :Linq4j简明介绍
开发JAVA一段时间,面临的一大问题就是集合操作,习惯了LINQ的简洁语法,对JAVA的集合操作实在是无甚好感,只能通过C系的循环实现筛选等操作,由于没有延迟执行特性,内存占用实在不敢恭维.因此便在网 ...
- 学习java窗口基本操作时无聊写的
学习java窗口基本操作时无聊写的 就当记录 代码如下: package day08; import java.awt.BorderLayout;import java.awt.Color;impor ...
- switch case :在JDK 7中,又加入了对String类型的支持,从此不用再写If-Else来判断字符串了
switch的case语句可以处理int,short,byte,char类型的值, 因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出. char a = 'e ...
- 传递的值是this,在js里就不用再写$(this)
<input class="editinput" value="${detail.earlymoneyrmb}" name="earlymone ...
随机推荐
- 怎么通过 Mysql 实现数据同步呢?
怎么使 mysql 数据同步先假设有主机 A 和 B ( linux 系统),主机 A 的 IP 分别是 1.2.3.4 (当然,也可以是动态的),主机 B 的 IP 是 5.6.7.8 .两个主机都 ...
- css3样式二
1.2D转换 通过 translate() 方法,元素从其当前位置移动,根据给定的 left(x 坐标) 和 top(y 坐标) 位置参数 如:div{transform: translate(50p ...
- DllImport attribute的总结
C#有没有方法可以直接都用已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法),而不需要重新编写代码? 答案是肯定,就是通过接下来要说的 DllImport . DllImp ...
- 进军Linux
大二的时候学习Java,学完Java SE之后就放弃了这条道路,踏上了嵌入式之路.那时候约定好,选择了DSP,从C2000开始学起,基础仅仅是会C51,有C语言和Java的基础.这几年随着项目的需求变 ...
- Android 网络开发之WIFI
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为&qu ...
- Oracle建表
1.oracle数据库中的多种数据结构: 1.表结构 存储数据 2.视图 一张表或多张表中数据的字节 3.sequence 主要用来生成主键值 4.index 提高检索性能 我们 ...
- less文件编译成微信小程序wxss文件
2016年9月21日,微信小程序正式开启内测.在微信生态下,触手可及.用完即走的微信小程序引起广泛关注,刷爆朋友圈子.在这样的火爆氛围中,作为一个前端开发者的我,也悄悄地去尝鲜.在做demo小示例的过 ...
- Jquery实现图片轮换效果
最近在看jquery书时,看到一个比较有趣的东西:图片轮换.这里和大家分享下我看完后写的一个demo.实现图片轮换要完成三部分模块:html部分.css部分.jqury部分.下面分步详细说明.1.ht ...
- jquery总结06-动画事件01-基础显示和隐藏
动画事件 .hide(option) 动画隐藏 会保存元素的原始属性值 $("#a2").hide({ duration: 3000, complete: function() ...
- Strus2学习Exception处理集锦(一)
2015-01-05 同学用dom4j写的一个更改节点文本的方法爆出这样一个错误: 代码: for(Iterator itr=root.elementIterator();itr.hasNext(); ...