LINQ для [закрытого] инструмента Java

40
задан Peter Mortensen 31 May 2010 в 09:33
поделиться

7 ответов

LINQ для Java был бы прекрасен, но проблемой является интеграция языка.

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

Контролируемые исключительные ситуации могли бы мешать, но мы должны были бы видеть. Эквивалент IQueryable должен был бы иметь своего рода общую контролируемую исключительную ситуацию - или возможно это могло быть универсально и в типе элемента и в типе исключительной ситуации...

Так или иначе, это все мечтательно - учитывая затруднения, которые сообщество Java испытывает из-за закрытий, я думаю, что это было бы безумие для ожидания чего-либо как LINQ в самом Java ранее, чем приблизительно 2012. Конечно, но это вовсе не значит это не было бы возможно на "подобном Java" языке. Groovy уже имеет определенные полезные аспекты, например.

Для стороны библиотеки, Будьте в спящем режиме, уже обеспечивает "неинтегрированную" версию большого количества функций LINQ к SQL. Для LINQ к Объектам необходимо посмотреть Google Java Collections API - это - много того же вида вещи (фильтрация, проектируя и т.д.). Без лямбд это намного более трудно для использования, конечно - но это все еще действительно, действительно удобно. (Я использую код Google Collections все время на работе, и я не хотел бы вернуться к наборам Java "ванили".)

63
ответ дан Jon Skeet 27 November 2019 в 01:24
поделиться

В спящем режиме использование HQL. Можно сделать Объект, но только для Реляционных баз данных

1
ответ дан yrcjaya 27 November 2019 в 01:24
поделиться

Стоит отметить, что Scala 2.8 будет иметь поддержку LINQ ...


Фактически, стандартные коллекции scala предоставляют API, который работает как LINQ-for-Objects в какой-то смысл. Вот пример:

List("Paris","Berlin","London","Tokyo")
  .filter(c => c.endsWith("n"))
  .map(c => c.length) 
// result would be length of the words that ends 
// with "n" letter ("Berlin" and "London").

Не бойтесь синтаксиса новой строки-точки: вы можете писать код в простом старом стиле:

Array(1,2,3,4,5,6).map(x => x*x)

И есть ряд проектов, которые обеспечивают синтаксис, близкий к LINQ-to-SQL. . Например, фрагмент, взятый из Squeryll:

import Library._
using(session) { 
  books.insert(new Author(1, "Michel","Folco"))            
  val a = from(authors)(a=> where(a.lastName === "Folco") select(a)) 
}
// but note that there is more code behind this example
14
ответ дан 27 November 2019 в 01:24
поделиться

Для более общего подхода к проблеме рассмотрим использование Querydsl .

Это обеспечивает синтаксис в стиле Linq с поддержкой jpa / hibernate, jdo, sql и java lifeends.

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

8
ответ дан 27 November 2019 в 01:24
поделиться

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

4
ответ дан 27 November 2019 в 01:24
поделиться

Расширением Java, которое предоставляет возможности LINQ-to-objects, является SBQL4J. Он предлагает:

  • Безопасность типов во время компиляции
  • Мощный механизм запросов с большими возможностями, чем LINQ
  • Совместимость с текущими JVM (он использует предварительную обработку для перевода запросов в чистый код Java)
  • Хорошая производительность (отражение не используется во время выполнения)
  • Четкая, точная семантика без ненужного, неясного синтаксического сахара.
0
ответ дан 27 November 2019 в 01:24
поделиться

Детские шаги:

Первый подход: реализовать Java LINQ, используя строки для выражений, вместо лямбд.

Написать IQueryProviders на основе строковых выражений.

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

Но сначала, я хочу, чтобы LINQ работал: типизированный linq в языке, это хорошая вещь, но главное: иметь возможность написать IQueryProviders, затем, написать провайдер для POJOs, провайдер для Hibernate, провайдер для SQL Server или Oracle, и т.д....

0
ответ дан 27 November 2019 в 01:24
поделиться
Другие вопросы по тегам:

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