基于Java8的LINQ开源项目:Java Enumerable

微软推出的LINQ曾经领先Java很长一段时间,如今随着Java 8的lambdas推出,Java总算赶上来,streams有如下方法:
map
filter
flatMap
distinct
sorted
limit (i.e. take)
skip
reduce (i.e fold)
min
max
any
all
generate (for building infinite lists)

但是有一问题不能扩展它们,比如如果希望实现如下:
first
last
nth
windowed
intersperse
intercalate
tails
intersect
zip
groupRuns

这些都是F#/Haskell的丰富函数功能,.NET 是使用 extension方法解决lambda这个问题的。

如今使用Java 8重新构建的LinQ开源项目推出:Java Enumerable

这个受F#,C#和Haskell的启发,使用Java递延懒集合的实现。目标是使与iterable中元素更容易打交道,提供如下:
Map
Zip
Zip3
Filter
FlatMap
Order
OrderBy
OrderDesc
OrderByDesc
Take
TakeWhile
Skip
SkipWhile
Iter
Iteri
DistinctUnion
Distinct
DistinctBy
Intersect
Except
First
Last
Nth
Fold
FoldWithDefaultSeed
Any
All
Windowed
Tails
Pairwise
GroupRuns
Intersperse
Intercalate
ToDictionary
ToGroupedDictionary
Range
Min
Max
MinBy
MaxBy

比如Iterator 链实现如下:


private Function<Iterable<TSource>, Iterator<TSource>> iteratorGenerator;

public static <TSource> Enumerable<TSource> init(Iterable<TSource> source){
return new Enumerable<>(_ig -> new EnumerableIterator<>(source));
}

protected Enumerable(Function<Iterable<TSource>, Iterator<TSource>> iteratorGenerator) {
this.iteratorGenerator = iteratorGenerator;
}

@Override
public Iterator<TSource> iterator() {
return iteratorGenerator.apply(this);
}

// The underlying iterator

public class EnumerableIterator<TSource> implements Iterator<TSource> {
protected Iterator<TSource> source;
private Iterable<TSource> input;

public EnumerableIterator(Iterable<TSource> input){
this.input = input;

reset();
}

protected void reset(){
source = input.iterator();
}

@Override
public boolean hasNext() {
return source.hasNext();
}

@Override
public TSource next() {
return (TSource)source.next();
}
}

基本思想是是为你想要做的每一个类型的处理创建一个迭代器,如果你要做一个map函数,你应当创建一个迭代器iterator来包裹源.

更多案例见:http://onoffswitch.net/building-linq-java/
[该贴被banq于2014-03-08 15:45修改过]