Что такое эквивалент Java для LINQ?
Для LINQ для Java нет ничего похожего.
...
редактировать
Теперь с Java 8 мы познакомились с Stream API, это симулятивный вид вещей, связанных с коллекциями, но это не совсем то же самое, что Linq.
Если это ORM, который вы ищете как Entity Framework, тогда вы можете попробовать Hibernate
:-)
Существует альтернативное решение 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();
Теперь доступны 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.
Вы можете выбрать элементы в коллекции (и многое другое) более читабельным способом, используя библиотеку lambdaj
https://code.google.com/archive/p/lambdaj/
Он имеет некоторые преимущества перед библиотекой Quaere, потому что он не использует волшебную строку, он полностью безопасен по типу и, на мой взгляд, предлагает более читаемую DSL.
Вы не найдете эквивалент LINQ, если вы не используете javacc, чтобы создать свой собственный эквивалент.
До того дня, когда кто-то найдет жизнеспособный способ сделать это, есть несколько хороших альтернатив, таких как
LINQ to Objects - JAVA 8 добавила Stream API, который добавляет поддержку операций функционального стиля в потоках значений:
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/
Существует проект под названием quaere.
Это фреймворк Java, который добавляет возможность запросов к коллекциям.
Примечание. По словам автора, проект больше не поддерживается.
Существует много эквивалентов LINQ для Java, см. здесь для сравнения.
Для типичной структуры стиля Quaere/LINQ рассмотрите возможность использования Querydsl. Querydsl поддерживает коллекции JPA/Hibernate, JDO, SQL и Java.
Я поддерживаю Querydsl, поэтому этот ответ предвзятый.
вы можете использовать scala, он похож на синтаксис, и он на самом деле, вероятно, более мощный, чем linq.
Как и в 2014 году, я могу наконец сказать, что LINQ наконец-то существует в java 8. Не нужно больше искать альтернативу LINQ.
Теперь, когда Java 8 поддерживает lambdas, возможно создать Java API, которые очень похожи на LINQ.
Jinq - одна из этих новых библиотек стиля LINQ для Java.
Я разработчик этой библиотеки. Он основан на пятилетнем исследовании использования анализа байт-кода для перевода Java на запросы базы данных. Подобно тому, как С# D-LINQ представляет собой слой запроса, который находится поверх платформы Entity Framework, Jinq может выступать в качестве слоя запроса, сидящего поверх JPA или jOOQ. Он поддерживает агрегацию, группы и подзапросы. Даже Эрик Мейер (создатель LINQ) имеет признанный Jinq.
С# -подобное решение JaQue, которое предоставляет деревья выражений для Java Lambdas. Помимо этого, могут быть реализованы локальные провайдеры LINQ.
См. SBQL4J. Это надежный синтаксический язык запросов, интегрированный с Java. Позволяет писать сложные и многократно вложенные запросы. Существует много операторов, Java-методы могут быть вызваны внутри запросов, как конструкторы. Запросы переводятся на чистый Java-код (во время выполнения нет отражения), поэтому выполнение выполняется очень быстро.
EDIT: Хорошо, до сих пор SBQL4J это ТОЛЬКО расширение языка Java, которое предоставляет возможности запросов, похожие на LINQ. Есть некоторые интересные проекты, такие как Quaere и JaQue, но они являются только API, а не расширением синтаксиса и семантики с сильной безопасностью во время компиляции.
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);
Я попробовал 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, но выглядит интересно.
Вы можете попробовать мою библиотеку 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.
Для базовых функциональных наборов Java 8 имеет встроенный интерфейс, большинство основных языков Java, не связанных с Java, встроены в него (Scala, Clojure и т.д.), и вы можете получить добавление в lib для более ранней Java версии.
Для полного языкового интегрированного доступа к базе данных SQL, Scala (работает на JVM) имеет Slick
Похоже на Linq, о котором все говорят, это просто LinqToObjects. Я считаю, что предлагает только функциональность, которая уже может быть реализована сегодня на Java, но с действительно уродливым синтаксисом.
То, что я вижу как реальную силу Linq в .Net, состоит в том, что лямбда-выражения могут использоваться в контексте, требующем либо делегирования, либо выражения, а затем скомпилироваться в соответствующую форму. Это позволяет работать с такими вещами, как LinqToSql (или ничего, кроме LinqToObjects), и позволяет им иметь синтаксис, идентичный LinqToObjects.
Похоже, что все упомянутые выше проекты предлагают только возможности LinqToObjects. Что заставляет меня думать, что функциональность LinqToSql не на горизонте для Java.
Там очень хорошая библиотека, которую вы можете использовать для этого.
Находится здесь: https://github.com/nicholas22/jpropel-light
Lambdas не будет доступен до Java 8, хотя использование его немного отличается и не кажется естественным.
Просто добавьте еще одну альтернативу: у Java 6 есть решение для запросов к базе данных типа с использованием пакета javax.persistence.criteria.
Хотя я должен сказать, что это не LINQ, потому что с LINQ вы можете запросить любой IEnumerable.
Для LINQ (LINQ to Objects) Java 8 будет иметь что-то эквивалентное, см. Project Lambda.
Он имеет Enumerable LINQ to objects extensions, например stuffs, Но для более сложных функций LINQ, таких как Expression и ExpressionTree (они необходимы для LINQ to SQL и других поставщиков LINQ, если они хотят предоставить что-то оптимизированное и real), еще нет эквивалента, но, возможно, мы увидим это в будущем:)
Но я не думаю, что в будущем в Java появятся что-то вроде декларативных запросов.
В java нет такой функции. Используя другой API, вы получите эту функцию. Например, у нас есть объект-животное, содержащий имя и идентификатор. У нас есть объект списка, имеющий объекты животных. Теперь, если мы хотим получить все имя животного, которое содержит "o" из объекта списка. мы можем написать следующий запрос
from(animals).where("getName", contains("o")).all();
Выше инструкции Query будет список животных, которые содержат '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);
}
Scala. Теперь я прочитал его, и нашел его как linq, но более простым и более нечитаемым. но scala может работать в linux, да? csharp нужно моно.
кроме указанных, можно также взглянуть на:
Анонимный пользователь упомянул еще один, 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, где
Возможно, не ответ, на который вы надеетесь, но если какая-то часть вашего кода нуждается в большой работе над коллекциями (поиск, сортировка, фильтрация, преобразования, анализ), вы можете принять во внимание, чтобы написать несколько классов в Clojure или Scala.
Из-за их функционального характера работа с коллекциями - это то, на что они лучше всего. У меня нет большого опыта работы с Scala, но с Clojure вы, вероятно, найдете более мощный Linq у вас под рукой и после компиляции классы, которые вы создадите, будут легко интегрироваться с остальной базой кода.
JaQu - эквивалент LINQ для Java. Хотя он был разработан для базы данных H2, он должен работать для любой базы данных, поскольку он использует JDBC.
Бесстыдная самонакладка: вы всегда можете использовать https://github.com/amoerie/jstreams
Работает на Java 6 и выше, идеально подходит для разработки Android.
Он очень похож на операторы Scala, lodash, С# LINQ и т.д.
Вы можете использовать Java Functional Utils для преобразования примеров С# 101 LINQ, совместимых с Java 1.7 на Android.
вы можете попробовать эту библиотеку: https://code.google.com/p/qood/
Вот несколько причин для его использования:
HQL (Hibernate Query Language) очень похож на Linq.Net
Нет эквивалента LINQ для Java. Но есть некоторые внешние API, которые выглядят как LINQ, такие как https://github.com/nicholas22/jpropel-light, https://code.google.com/p/jaque/
Не совсем эквивалент Linq to SQL для Java. но что-то близкое ему. Запрос DSL
Был язык программирования Pizza (расширение Java), и вы должны посмотреть на него. - Он использует концепцию "беглых интерфейсов" для запроса данных декларативным образом и в принципе идентичен LINQ без выражений запроса (http://en.wikipedia.org/wiki/Pizza_programming_language). Но, увы, этого не преследовали, но это был бы один из способов получить что-то похожее на LINQ на Java.