Что такое Java-эквивалент для LINQ?

741

Что такое эквивалент Java для LINQ?

  • 4
    Похоже, что это LINQ to SQL.
  • 8
    Проверьте это: github.com/nicholas22/jpropel-light, реальный пример: new String [] {"james", "john", "john", "eddie"} .where (startWith ("j")). ToList () .distinct ();
Показать ещё 6 комментариев
Теги:
linq

35 ответов

767
Лучший ответ

Для LINQ для Java нет ничего похожего.

...

редактировать

Теперь с Java 8 мы познакомились с Stream API, это симулятивный вид вещей, связанных с коллекциями, но это не совсем то же самое, что Linq.

Если это ORM, который вы ищете как Entity Framework, тогда вы можете попробовать Hibernate

:-)

  • 9
    есть ли что-то в плане? интегрированы в язык? Это номер JCP? и т. д.
  • 5
    Совершенно верно, хотя большая часть того, что делает LINQ sooo приятным, заключается в том, насколько глубоко он интегрирован в язык и компилятор
Показать ещё 14 комментариев
144

Существует альтернативное решение Coollection.

Coolection не претендует на новую лямбда, однако мы окружены старыми старыми Java-проектами, в которых эта библиотека поможет. Он очень прост в использовании и расширении, охватывая только самые используемые действия итерации над коллекциями, например:

from(people).where("name", eq("Arthur")).first();
from(people).where("age", lessThan(20)).all();
from(people).where("name", not(contains("Francine"))).all();
  • 5
    Строка для имени столбца, что означает, что автозаполнение компилятора и IDE не поможет против опечаток, а рефакторинг сложен. Есть ли планы изменить это?
  • 2
    Привет, Экево. Я думаю, что это будет круто, и я попытался сделать это когда-нибудь. Но в этот момент, с Java 8, Coollection устарела. Может быть, это полезно для старых проектов ... Как вы думаете?
Показать ещё 1 комментарий
133

Теперь доступны Lambdas в Java 8 в виде JSR- 335 - Лямбда-выражения для языка программирования JavaTM

UPDATE: Теперь выпущен JDK8, который содержит проект lambda. Стоит захватить копию Java 8 в действии в настоящее время MEAP.

Прочитайте Brian Goetz статьи, касающиеся лямбда, для достойного понимания того, как lambdas реализованы в JDK8, а также получая понимание потоков, внутренняя итерация, короткое замыкание и ссылки на конструкторы. Также проверьте JSR выше, чтобы получить дополнительные примеры.

Я написал блог о некоторых преимуществах использования lambdas в JDK8 под названием The Power of the Arrow, а также NetBeans 8 имеет большую поддержку для преобразования конструкций в JDK8, о которых я также писал в блоге о Миграция в JDK 8 с NetBeans.

  • 0
    Разве лямбды также не были запланированы на Java 7? Что случилось с этим?
  • 7
    Оракул купил Солнце (язык в щеке). Java 7 занимала слишком много времени (5 лет), поэтому лямбды не попали в шорт-лист, это разочаровало массы. Это говорит о том, что Oracle выглядит так, как будто собирает мяч, и я думаю, что у нас запланирована Java 8 октября следующего года.
Показать ещё 4 комментария
118

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

https://code.google.com/archive/p/lambdaj/

Он имеет некоторые преимущества перед библиотекой Quaere, потому что он не использует волшебную строку, он полностью безопасен по типу и, на мой взгляд, предлагает более читаемую DSL.

  • 6
    Это хорошо, но это далеко от того, чтобы собирать запрос и выполнять его снова sql, xml, collection и т. Д.
  • 0
    почему я могу получить java.lang.ExceptionInInitializerError при использовании lambdaj select для пользовательского класса в моем проекте Android?
Показать ещё 1 комментарий
100

Вы не найдете эквивалент LINQ, если вы не используете javacc, чтобы создать свой собственный эквивалент.

До того дня, когда кто-то найдет жизнеспособный способ сделать это, есть несколько хороших альтернатив, таких как

  • 0
    github.com/TrigerSoft/jaque нашел этот путь и позволяет создавать деревья выражений. В сочетании с Java 8 Lambdas любая емкость LINQ может быть реализована с теми же усилиями, что и в .Net.
  • 0
    Смотрите этот ответ для сравнения: stackoverflow.com/questions/25989449/…
45

LINQ to Objects - JAVA 8 добавила Stream API, который добавляет поддержку операций функционального стиля в потоках значений:

Пакет java.util.stream

Java 8 Разъяснение: применение Lambdas к коллекциям Java

LINQ to SQL/NHibernate/etc. (запрос базы данных). Один из вариантов - использовать JINQ, который также использует новые функции JAVA 8 и был выпущен 26 февраля 2014 года на Github: https://github.com/my2iu/Jinq

Jinq предоставляет разработчикам простой и естественный способ записи базы данных запросов в Java. Вы можете обрабатывать данные базы данных, такие как обычные объекты Java хранится в коллекциях. Вы можете перебирать их и фильтровать, используя нормальные Java-команды, и весь ваш код будет автоматически переведенные в оптимизированные запросы к базе данных. Наконец, стиль LINQ запросы доступны для Java!

Сайт проекта JINQ: http://www.jinq.org/

  • 0
    Не знаю, почему читатели не обратили внимания на ваш ответ, хотя Stream API ближе всего к LINQ!
  • 1
    Streams API - плохая шутка по сравнению с LINQ.
Показать ещё 3 комментария
28

Существует проект под названием quaere.

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

Примечание. По словам автора, проект больше не поддерживается.

  • 2
    Quaere выглядит так, как будто предоставляет немного того, что обеспечивает LINQ, но вопрос заключается в «эквивалентном»
  • 6
    Так что это что-то вроде LINQ, если не прямой эквивалент? По крайней мере, это звучит полезно
Показать ещё 1 комментарий
16

Существует много эквивалентов LINQ для Java, см. здесь для сравнения.

Для типичной структуры стиля Quaere/LINQ рассмотрите возможность использования Querydsl. Querydsl поддерживает коллекции JPA/Hibernate, JDO, SQL и Java.

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

  • 6
    Ссылка "подобные рамки" не работает. У вас все еще есть эквивалентная страница?
  • 0
    Когда мы получим книгу QueryDSL? Или даже доступные варианты обучения? Ваша ссылка поддержки 404s.
12

вы можете использовать scala, он похож на синтаксис, и он на самом деле, вероятно, более мощный, чем linq.

  • 1
    Особенно Скала "для понимания".
10

Как и в 2014 году, я могу наконец сказать, что LINQ наконец-то существует в java 8. Не нужно больше искать альтернативу LINQ.

9

Теперь, когда Java 8 поддерживает lambdas, возможно создать Java API, которые очень похожи на LINQ.

Jinq - одна из этих новых библиотек стиля LINQ для Java.

Я разработчик этой библиотеки. Он основан на пятилетнем исследовании использования анализа байт-кода для перевода Java на запросы базы данных. Подобно тому, как С# D-LINQ представляет собой слой запроса, который находится поверх платформы Entity Framework, Jinq может выступать в качестве слоя запроса, сидящего поверх JPA или jOOQ. Он поддерживает агрегацию, группы и подзапросы. Даже Эрик Мейер (создатель LINQ) имеет признанный Jinq.

9

С# -подобное решение JaQue, которое предоставляет деревья выражений для Java Lambdas. Помимо этого, могут быть реализованы локальные провайдеры LINQ.

  • 2
    Могу ли я использовать JaQue для чтения / записи файлов XML так же, как мы делаем с LINQ?
8

См. SBQL4J. Это надежный синтаксический язык запросов, интегрированный с Java. Позволяет писать сложные и многократно вложенные запросы. Существует много операторов, Java-методы могут быть вызваны внутри запросов, как конструкторы. Запросы переводятся на чистый Java-код (во время выполнения нет отражения), поэтому выполнение выполняется очень быстро.

EDIT: Хорошо, до сих пор SBQL4J это ТОЛЬКО расширение языка Java, которое предоставляет возможности запросов, похожие на LINQ. Есть некоторые интересные проекты, такие как Quaere и JaQue, но они являются только API, а не расширением синтаксиса и семантики с сильной безопасностью во время компиляции.

  • 6
    Вы можете упомянуть свою роль в проекте.
7

https://code.google.com/p/joquery/

Поддерживает различные возможности,

Данный сбор,

Collection<Dto> testList = new ArrayList<>();

типа,

class Dto
{
    private int id;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getText()
    {
        return text;
    }
}

Фильтр

Java 7

Filter<Dto> query = CQ.<Dto>filter(testList)
    .where()
    .property("id").eq().value(1);
Collection<Dto> filtered = query.list();

Java 8

Filter<Dto> query = CQ.<Dto>filter(testList)
    .where()
    .property(Dto::getId)
    .eq().value(1);
Collection<Dto> filtered = query.list();

Кроме того,

Filter<Dto> query = CQ.<Dto>filter()
        .from(testList)
        .where()
        .property(Dto::getId).between().value(1).value(2)
        .and()
        .property(Dto::grtText).in().value(new string[]{"a","b"});

Сортировка (также доступна для Java 7)

Filter<Dto> query = CQ.<Dto>filter(testList)
        .orderBy()
        .property(Dto::getId)
        .property(Dto::getName)
    Collection<Dto> sorted = query.list();

Группировка (также доступна для Java 7)

GroupQuery<Integer,Dto> query = CQ.<Dto,Dto>query(testList)
        .group()
        .groupBy(Dto::getId)
    Collection<Grouping<Integer,Dto>> grouped = query.list();

Соединения (также доступны для Java 7)

Учитывая,

class LeftDto
{
    private int id;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getText()
    {
        return text;
    }
}

class RightDto
{
    private int id;
    private int leftId;
    private String text;

    public int getId()
    {
        return id;
    }

    public int getLeftId()
        {
            return leftId;
        }

    public int getText()
    {
        return text;
    }
}

class JoinedDto
{
    private int leftId;
    private int rightId;
    private String text;

    public JoinedDto(int leftId,int rightId,String text)
    {
        this.leftId = leftId;
        this.rightId = rightId;
        this.text = text;
    }

    public int getLeftId()
    {
        return leftId;
    }

    public int getRightId()
        {
            return rightId;
        }

    public int getText()
    {
        return text;
    }
}

Collection<LeftDto> leftList = new ArrayList<>();

Collection<RightDto> rightList = new ArrayList<>();

Можно зарегистрироваться как,

Collection<JoinedDto> results = CQ.<LeftDto, LeftDto>query().from(leftList)
                .<RightDto, JoinedDto>innerJoin(CQ.<RightDto, RightDto>query().from(rightList))
                .on(LeftFyo::getId, RightDto::getLeftId)
                .transformDirect(selection ->  new JoinedDto(selection.getLeft().getText()
                                                     , selection.getLeft().getId()
                                                     , selection.getRight().getId())
                                 )
                .list();

Выражения

Filter<Dto> query = CQ.<Dto>filter()
    .from(testList)
    .where()
    .exec(s -> s.getId() + 1).eq().value(2);
7

Я попробовал guava-libraries из Google. Он имеет FluentIterable, который, как мне кажется, близок к LINQ. Также см. FunctionalExplained.

List<String> parts = new ArrayList<String>();  // add parts to the collection.    
FluentIterable<Integer> partsStartingA = 
    FluentIterable.from(parts).filter(new Predicate<String>() {
        @Override
        public boolean apply(final String input) {
            return input.startsWith("a");
        }
    }).transform(new Function<String, Integer>() {
        @Override
        public Integer apply(final String input) {
            return input.length();
        }
    });

Кажется, это обширная библиотека для Java. Конечно, не так лаконично, как LINQ, но выглядит интересно.

4

Вы можете попробовать мою библиотеку CollectionsQuery. Он позволяет запускать LINQ как запросы по коллекциям объектов. Вы должны передать предикат, как в LINQ. Если вы используете java6/7, вам нужно использовать старый синтаксис с интерфейсами:

List<String> names = Queryable.from(people)
                                    .filter(new Predicate<Person>() {
                                                public boolean filter(Person p) {
                                                    return p.age>20;
                                                }
                                            })
                                    .map   (new Converter<Person,String>() {
                                                public Integer convert(Person p) {
                                                    return p.name;
                                                }
                                            })
                                    .toList();

Вы также можете использовать его в Java8 или в старой java с RetroLambda и gradle плагин, тогда у вас будет новый модный синтаксис:

List<String> names = Queryable.from(people)
                                    .filter(p->p.age>20)
                                    .map   (p->p.name)
                                    .toList();

Если вам нужно запустить запросы БД, чем вы можете посмотреть на JINQ, как упоминалось выше, но он не может быть перенесен с помощью RetroLambda, doe для использования серийных lambdas.

4

Для базовых функциональных наборов Java 8 имеет встроенный интерфейс, большинство основных языков Java, не связанных с Java, встроены в него (Scala, Clojure и т.д.), и вы можете получить добавление в lib для более ранней Java версии.

Для полного языкового интегрированного доступа к базе данных SQL, Scala (работает на JVM) имеет Slick

4

Похоже на Linq, о котором все говорят, это просто LinqToObjects. Я считаю, что предлагает только функциональность, которая уже может быть реализована сегодня на Java, но с действительно уродливым синтаксисом.

То, что я вижу как реальную силу Linq в .Net, состоит в том, что лямбда-выражения могут использоваться в контексте, требующем либо делегирования, либо выражения, а затем скомпилироваться в соответствующую форму. Это позволяет работать с такими вещами, как LinqToSql (или ничего, кроме LinqToObjects), и позволяет им иметь синтаксис, идентичный LinqToObjects.

Похоже, что все упомянутые выше проекты предлагают только возможности LinqToObjects. Что заставляет меня думать, что функциональность LinqToSql не на горизонте для Java.

4

Там очень хорошая библиотека, которую вы можете использовать для этого.

Находится здесь: https://github.com/nicholas22/jpropel-light

Lambdas не будет доступен до Java 8, хотя использование его немного отличается и не кажется естественным.

4

Просто добавьте еще одну альтернативу: у Java 6 есть решение для запросов к базе данных типа с использованием пакета javax.persistence.criteria.

Хотя я должен сказать, что это не LINQ, потому что с LINQ вы можете запросить любой IEnumerable.

  • 0
    Да, это JPA API. Далеко от LINQ, но лучше, чем ничего. И можно сказать, что он слабо основан на Hibernate Criteria API. См .: docs.jboss.org/hibernate/core/3.6/reference/en-US/html/…
3

Для LINQ (LINQ to Objects) Java 8 будет иметь что-то эквивалентное, см. Project Lambda.

Он имеет Enumerable LINQ to objects extensions, например stuffs, Но для более сложных функций LINQ, таких как Expression и ExpressionTree (они необходимы для LINQ to SQL и других поставщиков LINQ, если они хотят предоставить что-то оптимизированное и real), еще нет эквивалента, но, возможно, мы увидим это в будущем:)

Но я не думаю, что в будущем в Java появятся что-то вроде декларативных запросов.

2

В java нет такой функции. Используя другой API, вы получите эту функцию. Например, у нас есть объект-животное, содержащий имя и идентификатор. У нас есть объект списка, имеющий объекты животных. Теперь, если мы хотим получить все имя животного, которое содержит "o" из объекта списка. мы можем написать следующий запрос

from(animals).where("getName", contains("o")).all();

Выше инструкции Query будет список животных, которые содержат 'o' алфавит в их имени. Более подробную информацию можно найти в следующем блоге. http://javaworldwide.blogspot.in/2012/09/linq-in-java.html

2

Отъезд tiny-q. (Обратите внимание, что вы в настоящее время не можете загрузить его.)

В этом примере приведен пример ссылки:

Сначала нам нужен набор некоторых данных, скажем, набор строк

String[] strings = { "bla", "mla", "bura", "bala", "mura", "buma" };

Теперь мы хотим выбрать только строки, начинающиеся с "b":

Query<String> stringsStartingWithB = new Query<String>(strings).where(
    new Query.Func<String, Boolean>(){
        public Boolean run(String in) {
            return in.startsWith("b");
        }
    }
);

Никакие фактические данные не будут скопированы или что-то в этом роде, оно будет обработано, как только вы начнете выполнять итерацию:

for(String string : stringsStartingWithB ) {
    System.out.println(string);
}
1

Scala. Теперь я прочитал его, и нашел его как linq, но более простым и более нечитаемым. но scala может работать в linux, да? csharp нужно моно.

  • 1
    Для запуска Scala требуется среда выполнения Java: она не обязательно будет работать при установке на чистом Linux, в зависимости от того, какие компоненты вы устанавливаете.
  • 0
    @Rup есть полностью совместимая JRE для GNU / Linux, и Mono не является полностью совместимой реализацией .NET.
Показать ещё 2 комментария
1

кроме указанных, можно также взглянуть на:

https://github.com/julien-may/ch.julien/tree/master/query

1

Анонимный пользователь упомянул еще один, Diting:

Diting - библиотека классов предоставляет возможности запросов для коллекций с помощью цепочки и анонимного интерфейса, например Linq в .NET. В отличие от большинства других библиотек коллекции, использующих статические методы, требуется итерация всей коллекции, Diting предоставляет базовый класс Enumerable class whitch содержит деффилированные цепочки для реализации запроса в коллекции или массиве.

Поддерживаемые методы: any, cast, contact, contains, count, distinct, elementAt, except, first, firstOrDefault, groupBy, interset, join, last, lastOrDefault, ofType, orderBy, orderByDescending, reverse, select, selectMany, single, singleOrDefault, skip, skipWhile, take, takeWhile, toArray, toArrayList, union, где

1

Возможно, не ответ, на который вы надеетесь, но если какая-то часть вашего кода нуждается в большой работе над коллекциями (поиск, сортировка, фильтрация, преобразования, анализ), вы можете принять во внимание, чтобы написать несколько классов в Clojure или Scala.

Из-за их функционального характера работа с коллекциями - это то, на что они лучше всего. У меня нет большого опыта работы с Scala, но с Clojure вы, вероятно, найдете более мощный Linq у вас под рукой и после компиляции классы, которые вы создадите, будут легко интегрироваться с остальной базой кода.

  • 1
    Groovy или jRuby также будут подходящими кандидатами, поскольку все они имеют гораздо более функциональный характер.
1

JaQu - эквивалент LINQ для Java. Хотя он был разработан для базы данных H2, он должен работать для любой базы данных, поскольку он использует JDBC.

0

Бесстыдная самонакладка: вы всегда можете использовать https://github.com/amoerie/jstreams

Работает на Java 6 и выше, идеально подходит для разработки Android.

Он очень похож на операторы Scala, lodash, С# LINQ и т.д.

0

Вы можете использовать Java Functional Utils для преобразования примеров С# 101 LINQ, совместимых с Java 1.7 на Android.

0

вы можете попробовать эту библиотеку: https://code.google.com/p/qood/

Вот несколько причин для его использования:

  • легкий: всего 9 открытых интерфейсов/классов для изучения.
  • запрос типа SQL: поддержка group-by, order-by, left join, формула,... и т.д..
  • для больших данных: используйте файл (QFS) вместо памяти кучи.
  • попытайтесь решить Несоответствие объектно-реляционного импеданса.
0

HQL (Hibernate Query Language) очень похож на Linq.Net

0

Нет эквивалента LINQ для Java. Но есть некоторые внешние API, которые выглядят как LINQ, такие как https://github.com/nicholas22/jpropel-light, https://code.google.com/p/jaque/

0

Не совсем эквивалент Linq to SQL для Java. но что-то близкое ему. Запрос DSL

0

Был язык программирования Pizza (расширение Java), и вы должны посмотреть на него. - Он использует концепцию "беглых интерфейсов" для запроса данных декларативным образом и в принципе идентичен LINQ без выражений запроса (http://en.wikipedia.org/wiki/Pizza_programming_language). Но, увы, этого не преследовали, но это был бы один из способов получить что-то похожее на LINQ на Java.

  • 1
    Конечно, это преследовалось, только не под названием «Пицца». Обобщения из Pizza были объединены в GJ, который затем стал ссылочным компилятором Java 1.3 (хотя обобщения были скрыты за флагом до 1.5). А пока ... остальные идеи, а также несколько дополнительных, стали Scala.
  • 0
    Спасибо за эту информацию, конечно, Scala является хорошим моментом здесь. Но эти возможности не интегрированы в язык Java. Вы можете использовать язык Scala для реализации красивого кода запроса и использовать полученный бинарный файл из Java.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню