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 了!的更多相关文章

  1. 再写一篇tps限流

    再写一篇tps限流 各种限流算法的称呼 网上有很多文章介绍限流算法,但是对于这些算法的称呼与描述也是有点难以理解.不管那么多了.我先按我理解的维度梳理一下. 主要维度是:是正向计数还是反向计数.是定点 ...

  2. Java是否还能再辉煌十年?

    目录 Java是否还能再辉煌十年? 一.前言 二.如今的Java语言 2.1 位居TIOBE榜首 2.2 革命性的语言 三.Java受到的挑战 3.1 后台服务器软件的语言竞争 3.1.1 Pytho ...

  3. 【优雅代码】04-1行代码完成多线程,别再写runnable了

    [优雅代码]04-1行代码完成多线程,别再写runnable了 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮 ...

  4. JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了

    JDBC 4.0 开始Java操作数据库不用再使用 Class.forName加载驱动类了 代码示例 转自 https://docs.oracle.com/javase/tutorial/jdbc/o ...

  5. Atitit 实现java的linq 以及与stream api的比较

    Atitit 实现java的linq 以及与stream api的比较 1.1. Linq 和stream api的关系,以及主要优缺点1 1.2. Linq 与stream api的适用场景1 1. ...

  6. java的LINQ :Linq4j简明介绍

    开发JAVA一段时间,面临的一大问题就是集合操作,习惯了LINQ的简洁语法,对JAVA的集合操作实在是无甚好感,只能通过C系的循环实现筛选等操作,由于没有延迟执行特性,内存占用实在不敢恭维.因此便在网 ...

  7. 学习java窗口基本操作时无聊写的

    学习java窗口基本操作时无聊写的 就当记录 代码如下: package day08; import java.awt.BorderLayout;import java.awt.Color;impor ...

  8. switch case :在JDK 7中,又加入了对String类型的支持,从此不用再写If-Else来判断字符串了

    switch的case语句可以处理int,short,byte,char类型的值, 因为short,byte,char都会转换成int进行处理,这一点也可以从生成的字节码看出. char a = 'e ...

  9. 传递的值是this,在js里就不用再写$(this)

    <input class="editinput" value="${detail.earlymoneyrmb}" name="earlymone ...

随机推荐

  1. 坑爹的 SONY AS100V GPS

    事情是这样的,为了记录自己的生活,也是出于对视频编辑的兴趣,买了一台 SONY 的 AS100V 运动摄像机. 公司到货,回家路上拍了一段,回家兴冲冲的连上电脑,想看看 GPS 数据,发现是 SONY ...

  2. dev GridView常用属性,事件

    一.属性 1.GridControl属性 //允许拖拽行 gridControl1.AllowDrop = true; 2.GridView属性 //不可编辑 gridView1.OptionsBeh ...

  3. LayaAir学习笔记

    1.Text文本类 var Text=laya.display.Text; Laya.init(620,400); Laya.stage.bgColor="#323232";//设 ...

  4. 转 苹果企业级帐号进行ipa打包,分发,下载等流程

    1,企业帐号介绍(1)使用企业开发帐号,我们可以发布一个 ipa 放到网上,所有人(包括越狱及非越狱设备)都可以直接通过链接下载安装,而不需要通过 AppStore 下载,也不需要安装任何证书.(2) ...

  5. angular-select绑定之后option不能更新问题

    使用ng-option-- http://jsfiddle.net/sseletskyy/uky9m/1/ 以及select中加入自定义指令  convert-to-number .directive ...

  6. FileItem类的常用方法

    FileItem类的常用方法: 1.  boolean isFormField() isFormField方法用于判断FileItem类对象封装的数据是一个普通文本表单字段,还是一个文件表单字段,如果 ...

  7. ISAP算法对 Dinic算法的改进

    ISAP算法对 Dinic算法的改进: 在刘汝佳图论的开头引言里面,就指出了,算法的本身细节优化,是比较复杂的,这些高质量的图论算法是无数优秀算法设计师的智慧结晶. 如果一时半会理解不清楚,也是正常的 ...

  8. tensorflow安装日志(PIP)

    最近刚刚接触深度学习,安装一下tf 环境:华硕Z170主板.i7 6700k.GTX1070.Ubuntu16.04.Python2.7 在这之前先装好了cuda8.0.cudnn5.0.caffe整 ...

  9. 2017年1月1日 星期日 --出埃及记 Exodus 21:27

    2017年1月1日 星期日 --出埃及记 Exodus 21:27 And if he knocks out the tooth of a manservant or maidservant, he ...

  10. 关于工程结合git的配置

    我们通常把代码放到git sever中,(scm manager)中,上传,下载代码, 可是通常工程的代码改动会有图标提示,改动过的,或者新增的,那么需要在eclipse的工程中做一下简单配置 1,工 ...