Что такое эквивалент Java для LINQ? [закрытый]

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

30 ответов


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

...

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

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

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

: -)


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

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

from(people).where("name", eq("Arthur")).first();
from(people).where("age", lessThan(20)).all();
from(people).where("name", not(contains("Francine"))).all();

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

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

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

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


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

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

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


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

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


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

пакета java.утиль.поток

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/


есть проект под названием желательно знать.

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

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


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

для Typesafe quaere / LINQ style framework рассмотрите возможность использования Querydsl. Querydsl поддерживает коллекции JPA / Hibernate, JDO, SQL и Java.

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


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


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


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

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

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


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


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

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


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


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

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

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


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

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

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


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

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

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


для основных функциональных коллекций Java 8 имеет встроенный, большинство основных не-Java JVM-языков имеют встроенный (Scala, Clojure и т. д.), И вы можете получить add on libs для более ранних версий Java.

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


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

Если вам нужно запустить DB queryes, чем вы можете посмотреть на JINQ, как упоминалось выше, но он не может быть перенесен RetroLambda, doe для использования сериализованных лямбд.


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

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

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


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

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

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


проверить 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);
}

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


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

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


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

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

поддерживаемые методы: любые, литой, контакт, содержится, количество, различных, elementAt, за исключением, во-первых, метода firstordefault, метода groupBy, интерсет, присоединиться, последний, метода lastordefault, метод oftype, предложение orderby, orderByDescending, реверс, выбор метода SelectMany, один, метода singleordefault, пропустить, skipWhile, принять, takeWhile, методом toArray, toArrayList, Союз, где


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

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


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


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


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