var isArray=function(value){
if(Array.isArray){
return Array.isArray(value);
}else{
return Object.prototype.toString.call(value)==='[object Array]';
}
}
var isObject=function(value){
return value !== null&&!isArray(value) && typeof value === 'object';
}
var _val=new Date;
console.log(isObject(_val));//true
console.log(Object.prototype.toString.call(_val)==='[object Object]');//false
Вы можете выбирать элементы в коллекции (и многое другое) в более удобном для чтения виде, используя библиотеку lambdaj
Для простых объектов Linq To, Лучшее, что я думаю, можно сделать в Java, это что-то вроде этого:
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);
Обратите внимание, что у меня нет Where
и Select
, соединенных в одно выражение. Я мог бы вставить определение отфильтровано
в одно место, где оно используется, но это, вероятно, сделало бы его (даже) менее читаемым. Проблема заключается в отсутствии методов расширения и лямбда-выражений. Наиболее близким к лямбдам мы можем воспользоваться с помощью этих объявлений анонимных классов. Они могут ссылаться на объекты, названные во включающей области видимости, но только на final
, поэтому они не могут ничего изменять (в отличие от лямбда-выражений в C #).
Кроме того, очень многословный синтаксис вызывает боль. Люди часто предлагали, чтобы Java предлагала более простой синтаксис для случаев, когда есть только один абстрактный (или интерфейсный) метод, и, следовательно, нет необходимости давать объявления имени или типа для того, что вы хотите переопределить. Тогда есть тот факт, что нет вывода типа и нет очевидного способа предоставить его в конструкторах универсальных классов, потому что new Select (отфильтрованный)
уже означает что-то еще.
Реализации для Select
] и Где
:
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(); }
}
Существует extra166y дополнение к JSR166y с конструкцией ParallelArray . В основном PLINQ для массивов объектов.
Quaere находится в положении пионера с LINQ в Java, но не является Syperafe, который является одним из основных точек LINQ.
QueryDSL - это безопасным и поддерживает фильтрация, сортировка и проектирование.
Он поддерживает операции на JPA / Hibernate, Jdo и SQL Backends.
Синтаксис аналогичен SQL с разницей, что основной порядок из списка.
Я сопровождающий Querydsl, поэтому этот ответ предвзятый.