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 ...
随机推荐
- phpcms V9 常用函数 及 代码整理
常用函数 及 常用代码 总结如下 <?php //转换字符串或者数组的编码 str_charset($in_charset, $out_charset, $str_or_arr) //获取菜单 ...
- CentOS 7 配置静态 ip
1. 需求场景: 在 CentOS7 上部署了一个 svn ,由于centOS7 默认是 dhcp 的,所以每过一段时间 ip 就会有变化,而 svn 要求 ip 是不能变的,不然没法同步. 网上找了 ...
- Dedecms 图片加上Alt或Title等属性写法
代码如下:$this->Fields['typename'] = $this->TypeLink->TypeInfos['typename']; SetSysEnv($this-&g ...
- ubuntu14.04设置静态ip
1. 找到文件并作如下修改: sudo vim /etc/network/interfaces 修改如下部分: auto eth0 iface eth0 inet static address 192 ...
- 前端使用js读取文件
最近同时问我js能不能读取本地文件: 想起以前看到js读取本地文件的文章,然后自己写了个demo. ps:这有点想Java的IO流,但是又有差别. 首先我们定义一个input标签type=" ...
- HDU 1072 Nightmare
Description Ignatius had a nightmare last night. He found himself in a labyrinth with a time bomb on ...
- js封装类
1.闭包函数中定义基类,使用基类定义类方法 ;var Appkit = function() { //定义类 var obj = new Object(); // 定义方法 obj.isWeixin ...
- 2016年12月29日 星期四 --出埃及记 Exodus 21:24
2016年12月29日 星期四 --出埃及记 Exodus 21:24 eye for eye, tooth for tooth, hand for hand, foot for foot,以眼还眼, ...
- python 学习笔记十九 django深入学习四 cookie,session
缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...
- 3.UIViewController详解
一. UIViewController,视图控制器,它是UIKit中非常重要的组成部分.它由控制器+View两部分组成. 控制器功能: ->实现代码逻辑,决定它自带的View的界面显示. -& ...