Вопрос

Начал изучать LINQ с C #.
Особенно LINQ для объектов и LINQ для XML.
Мне действительно нравится мощь LINQ.

Я узнал, что есть нечто, называемое JLINQ реализация на Jscript.
Также (как написал Катберт) Scala будет иметь LINQ

Вы знаете, будет ли LINQ или что-то подобное частью Java 7?

Обновить:Интересный пост от 2008 года - Инструмент LINQ для Java

Это было полезно?

Решение

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

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

РЕДАКТИРОВАТЬ :

Вот пример возможностей запросов 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
}

Другие советы

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

  • Монадическое понимание
  • Интеграция с базой данных
  • SQL-подобный синтаксис
  • Манипулирование АСТ

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

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

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

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

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

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

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

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

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

С помощью ламбдадж В библиотеке вы можете найти пользователей с наивысшей репутацией следующим образом:

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

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

Проверить Куэре.Это 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.)

Вы могли бы попробовать диета который реализует методы цепочки запросов к коллекции.

   Integer[] values = new Integer[] {0,1,2,3,4,5,6,7,8,9,10};

   Enumerable<Integer> query = new Enumerable<Integer>(values).where(new Predicate<Integer>(){

    @Override
    public boolean evaluate(Integer value) throws Exception {
        return value % 2 == 0;
    }});

   for(Integer i : query)
   {
       System.out.write(i);
       System.out.write('\n');
   }

CQEngine или механизм запросов к коллекциям http://code.google.com/p/cqengine/ кажется чрезвычайно многообещающим.Хотя не пробовал.Он позволяет создавать индексы по коллекциям и запрашивать их.Предполагается, что это будет очень быстро.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top