Есть ли что-то как LINQ для Java? [закрытый]

25
задан Community 23 May 2017 в 12:03
поделиться

6 ответов

Посмотрите на Scala, который является мощным функциональным языком программирования, но похож на Java и работает на платформе Java.

В Scala можно использовать практически те же конструкции кода, что и в LINQ, хотя и без специальных запросов, синтаксис которых присутствует в C# или VB.

EDIT :

Вот пример возможностей Scala по выполнению запросов :

// Get all StackOverflow users with more than 20,000 reputation points.
val topUsers = for{
    u <- users
    if u.reputation > 20000
} yield u;

println ("Users with more than 20,000 reputation:")
for (u <- topUsers) {
    println u.name
}
33
ответ дан 28 November 2019 в 17:39
поделиться

Важно отметить, что LINQ - это четыре вещи:

  • Monadic comprehension
  • Database integration
  • SQL-подобный синтаксис
  • AST manipulation

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

Если взять, например, Scala, то он обладает монадским пониманием без трех других. Существует библиотека ScalaQuery, которая обеспечивает интеграцию баз данных через монадское понимание (внутренняя способность делать это - главная причина, по которой монады - это круто). Другой проект под названием ScalaQL, я думаю, собирается предоставить практически то же самое, но с использованием плагина компилятора для его усовершенствования. Я не знал о работе Мигеля Гарсия, о которой Вы упомянули, но, увидев другие его работы, я в восторге от этого.

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

Две вещи, которые не делает Scala. Первое - это SQL-подобный синтаксис. Ничего не поделаешь: Синтаксис SQL выглядит неуместно в Scala. Думаю, можно с уверенностью сказать, что большинство Scala-программистов предпочли бы остаться с тем, что им знакомо - так называемым пониманием.

Другая вещь, о которой я еще не говорил, это манипулирование AST. Это способность манипулировать кодом, который был разобран компилятором, но еще не преобразован в байтовый код, давая возможность изменять его до завершения генерации.

Я думаю, такая вещь была бы благом для Scala -- черт, для любого языка. Но, опять же, у меня есть опыт программиста из Форта, где возможность изменять код в том виде, в котором он был скомпилирован, была дана Богом. .Net может делать это через LINQ, так же как и некоторые другие языки, такие как Ruby.

.
30
ответ дан 28 November 2019 в 17:39
поделиться

Проверьте Quaere. Это LINQ-подобный DSL для Java, который вы можете включить в качестве библиотеки. Пример:

// Get all StackOverflow users with more than 20,000 reputation points.
Iterable<User> topUsers = from("u").in(entityManager.entity(User.class)).
    where(gt("u.getReputation()", 20000)).
    select("u");

System.out.println("Users with more than 20,000 reputation:");
for (User u : topUsers) {
    System.out.println(u.getName());
}

Однако, обратите внимание, что Java не имеет концепции, аналогичной методам расширения. Что бы ни было в Quaere, это в основном то, что вы застряли; если вам нужно сделать свои собственные специальные утилиты, они, вероятно, должны быть в отдельных классах утилит (ick).

Кроме того, так как Java < 7 не имеет нативных замыканий, вы застряли со строками для ссылок, и ваша IDE не может самопроверять их, чтобы показать вам проблемы, если вы что-то неправильно вводите. (Более умная IDE могла бы справиться с этим недостатком, однако, если бы кто-то написал плагины для интроспекции Quaere.)

.
10
ответ дан 28 November 2019 в 17:39
поделиться

LINQ будет тяжело в Java из-за текущего отсутствия закрытий. Предполагая, что Java 7 действительно получается разумно компактная поддержка закрытия и методы расширения, LINQ с точки зрения «точечной обозначения» должен быть осуществимым, даже если он не получает эквивалент выражений запросов.

Библиотека коллекции Google (сейчас в 1.0 - но для замены Guava , когда это готово), содержит многие необходимые методы - и я не буду удивлен См. 101 LINQ-подобные API, пружинусь, как только поддержка закрытия выглядит достаточно окончательно.

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

13
ответ дан 28 November 2019 в 17:39
поделиться

Используя библиотеку lambdaj , вы можете найти лучшие пользователи репутации, как следует:

List<User> topUsers = 
    select(users, having(on(User.class).getReputation(), greaterThan(20000)));

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

11
ответ дан 28 November 2019 в 17:39
поделиться

Есть ли что-нибудь более простое в использовании, как LINQ-2-SQL на JVM? Я хочу сгенерировать сущности (классы) из схемы БД с помощью некоторого инструмента и использовать их для непосредственного взаимодействия с БД. Есть ли решение без XML? Я не хочу аннотировать классы. В .NET инструмент называется sqlmetal. Это своего рода препроцессор, который, так сказать, генерирует все классы БД.

Как только это будет сделано, я думаю, будет довольно просто использовать встроенные языковые конструкции Scala.

2
ответ дан 28 November 2019 в 17:39
поделиться
Другие вопросы по тегам:

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