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

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

Ответы

Ответ 1

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

...

Изменить

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

Если вы ищете ORM, например Entity Framework, вы можете попробовать Hibernate

:-)

Ответ 2

Существует альтернативное решение, 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();

Ответ 3

Теперь доступны 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.

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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/

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

Ответ 11

Java LINQ to SQL реализация. Обеспечивает полную языковую интеграцию и больший набор функций по сравнению с .NET LINQ.

Ответ 12

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

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

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

Ответ 13

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

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

Ответ 14

Я попробовал 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, но выглядит интересно.

Ответ 15

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);

Ответ 16

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

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

Ответ 17

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

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

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

Ответ 18

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

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

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

Ответ 19

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

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

Ответ 20

Вы можете попробовать мою библиотеку 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.

Ответ 21

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

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

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

Ответ 22

Отъезд 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);
}

Ответ 23

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

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

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

Ответ 24

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

Ответ 25

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

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

Ответ 26

Анонимный пользователь упомянул еще один, 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, где

Ответ 28

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

Ответ 29

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

Ответ 30

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