Подтвердить что ты не робот

Есть что-то вроде LINQ для Java?

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

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

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

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

4b9b3361

Ответ 1

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

В Scala можно использовать по существу те же кодовые конструкции, что и в LINQ, хотя без синтаксиса специальных запросов, присутствующих в С# или 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
}

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

Отъезд 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.)

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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