Đối với đơn giản LINQ to Objects, tốt nhất tôi nghĩ rằng có thể được thực hiện trong Java là một cái gì đó như thế này:
Vector<Integer> numbers = new Vector<Integer>();
numbers.add(42);
numbers.add(3);
numbers.add(16);
numbers.add(92);
numbers.add(9);
Iterable<Integer> filtered = new Where<Integer>(numbers) {
protected boolean predicate(Integer i) { return i > 10; }
};
Iterable<String> converted = new Select<Integer, String>(filtered) {
protected String select(Integer i) { return i.toString(); }
};
for (final String str : converted)
System.out.println(str);
Lưu ý rằng tôi đã không nhận được Where
và Select
chuỗi với nhau trong một biểu thức. Tôi có thể chèn định nghĩa của filtered
vào một nơi nó được sử dụng, nhưng điều đó có lẽ sẽ làm cho nó (thậm chí) ít có thể đọc được. Các vấn đề là thiếu các phương pháp mở rộng và lambdas. Gần nhất chúng ta có thể nhận được lambdas là bởi những tuyên bố lớp ẩn danh. Chúng có thể tham chiếu đến các đối tượng có tên trong phạm vi kèm theo, nhưng chỉ có final
s, vì vậy chúng không thể đột biến bất kỳ thứ gì (không giống lambdas trong C#).
Cú pháp cực kỳ dài dòng là một nỗi đau. Mọi người thường đề xuất rằng Java nên cung cấp một cú pháp đơn giản hơn cho các trường hợp chỉ có một phương thức trừu tượng (hoặc giao diện), và do đó không cần đưa ra khai báo tên hoặc kiểu cho những gì bạn muốn ghi đè. Sau đó, có một thực tế là không có suy luận kiểu, và không có cách rõ ràng để cung cấp nó trên constructors lớp chung vì new Select(filtered)
đã có nghĩa là cái gì khác.
Việc triển khai cho Select
và Where
là:
abstract class Select<TSource, TResult> implements Iterable<TResult>
{
private Iterable<TSource> _source;
public Select(Iterable<TSource> source)
{ _source = source; }
private class Iter implements Iterator<TResult>
{
private Iterator<TSource> _i;
public Iter() { _i = _source.iterator(); }
public void remove()
{ _i.remove(); }
public boolean hasNext()
{ return _i.hasNext(); }
public TResult next()
{ return select(_i.next()); }
}
protected abstract TResult select(TSource source);
public Iterator<TResult> iterator()
{ return new Iter(); }
}
abstract class Where<TSource> implements Iterable<TSource>
{
private Iterable<TSource> _source;
public Where(Iterable<TSource> source)
{ _source = source; }
private class Iter implements Iterator<TSource>
{
private Iterator<TSource> _i;
private TSource _cachedNext;
private boolean _hasCachedNext;
public Iter()
{
_i = _source.iterator();
fetch();
}
public void remove()
{ _i.remove(); }
public boolean hasNext()
{ return _hasCachedNext; }
public TSource next()
{
TSource result = _cachedNext;
fetch();
return result;
}
private void fetch()
{
_hasCachedNext = false;
while (_i.hasNext())
{
_cachedNext = _i.next();
if (predicate(_cachedNext))
{
_hasCachedNext = true;
return;
}
}
}
}
protected abstract boolean predicate(TSource source);
public Iterator<TSource> iterator()
{ return new Iter(); }
}
Nguồn
2009-07-17 16:47:56
Đối với LINQ đối tượng kiểm tra github.com/nicholas22/jpropel-light, ví dụ thực: chuỗi mới [] {"james", "john", "john", "eddie"} .where (startsWith ("j")) .toList(). khác biệt(); –