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. win64位安装python-mysqldb1.2.5

    在其他版本的mysqldb里面时间查询有问题最后确定还是在 1.2.5 版本下来解决,需要解决的问题就是这个:"Cannot open include file: 'config-win.h ...

  2. 关于SSIS中解密FTP字符串的方法

    FTP(File Transfer Protocol),是文件传输协议的简称.用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).用户可以通过它把自己的PC ...

  3. python之excel自动报表

    一.自动报表前期工作: 需要安装XlsxWriter模块,可以从github上下载以后解压.setup.py install. 二.程序: #!/usr/bin/env python # -*- co ...

  4. animate动画jquery

    <script> $(".change").animate({height:"hide",width:"300px"},&quo ...

  5. Xcode奔溃错误码

    在这里了解一下XCode用来表示各种崩溃类型的术语,补充一些这方面的各知识.崩溃通常是指操作系统向正在运行的程序发送的信号,所以我们在查看崩溃日志时,常常看到如下错误摘要:Application re ...

  6. BeanUtils.copyProperties()方法和PropertyUtils.copyProperties()的区别

    首先两者来源于同一个包: import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.Prop ...

  7. java开发中中文乱码总结

    1.jsp页面内容显示乱码 这种乱码原因很简单,一般的工具或解码程序对中文字符解析时采用默认的解码方式: <%@ page contentType="text/html; charse ...

  8. nil、Nil、NULL、NSNull的区别

    nil:指向一个对象的空指针,对objective c id 对象赋空值. Nil:指向一个类的空指针,表示对类进行赋空值. NULL:指向其他类型(如:基本类型.C类型)的空指针, 用于对非对象指针 ...

  9. 【前端】Three.js

    Three.js 基本概念 渲染器(Renderer) 渲染器将和Canvas元素进行绑定 场景(Scene) 在Three.js中添加的物体都是添加到场景中的,因此它相当于一个大容器.一般说,场景里 ...

  10. SQL(oracle) 取得分组后最大值记录

    方法一 select t1.a,t1.b,t1.c from test t1 inner join (seelct a,max(b) as b from test group by a) t2 on  ...