Вопрос - Кто-либо использующий его уже? (LINQ к Объектам для Java) [закрытый]

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
5
задан Marty Pitt 8 July 2009 в 07:59
поделиться

4 ответа

Вы можете выбирать элементы в коллекции (и многое другое) в более удобном для чтения виде, используя библиотеку lambdaj

http://code.google.com/p/lambdaj/

5
ответ дан 13 December 2019 в 22:13
поделиться

Для простых объектов 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(); }
}
1
ответ дан 13 December 2019 в 22:13
поделиться

Существует extra166y дополнение к JSR166y с конструкцией ParallelArray . В основном PLINQ для массивов объектов.

0
ответ дан 13 December 2019 в 22:13
поделиться

Quaere находится в положении пионера с LINQ в Java, но не является Syperafe, который является одним из основных точек LINQ.

QueryDSL - это безопасным и поддерживает фильтрация, сортировка и проектирование.

Он поддерживает операции на JPA / Hibernate, Jdo и SQL Backends.

Синтаксис аналогичен SQL с разницей, что основной порядок из списка.

Я сопровождающий Querydsl, поэтому этот ответ предвзятый.

3
ответ дан 13 December 2019 в 22:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: