Существуют ли в Java какие-либо библиотеки, подходящие для обеспечения функциональности Linq?
Существуют ли в Java какие-либо библиотеки, подходящие для обеспечения функциональности Linq?
Ответы:
Чтобы получить полный синтаксис запроса LINQ, вам потребуется обновить спецификацию языка и компиляторы, поддерживающие новые ключевые слова и структуру синтаксиса. Это далеко за пределами большинства читателей здесь.
Чтобы получить Linq-подобный синтаксис метода-цепочки в Java, который выглядит и работает так же, как в C #, вам нужны две вещи, которые Java не поддерживает; методы расширения (статические методы, которые можно применять к экземпляру, как если бы это был метод экземпляра) и лямбда-выражения (анонимные делегаты). Тем не менее, эти два могут быть подделаны с помощью существующих конструкций Java, если вы хотите подвергнуться небольшому дополнительному многословию кодирования. Одна вещь, которую я нахожу особенно удивительной в Java, это возможность создавать анонимные реализации интерфейса; применяется к интерфейсу с единственной чистой функцией, которая в основном допускает простые анонимные делегаты, при условии, что у вас есть интерфейс для каждой сигнатуры метода, которая вам понадобится.
Таким образом, сторона Linq, IEnumerable (Iterable для Javaheads), как цепочка методов, должна быть приближена в Java; Вы бы в основном реализовали это как свободный интерфейс, который управляет монадой. Вам понадобится класс вроде a LinqIterable
, реализующий Iterable, который:
Таким образом, вы, вероятно, могли бы определить «свободную» библиотеку, которая позволила бы оператор, такой как:
Map<String, Integer> results = Linq.FromIterable(sourceList)
.Where(new Predicate{public bool Op(SomeStruct in){return in.SomeString == "criteria";}})
.OrderBy(new Func{public String Op(SomeStruct in){return in.SomeOtherString;}})
.Select(new Func{public SomeOtherStruct Op(SomeStruct in){return new SomeOtherStruct(in.SomeOtherString, in.SomeInt);}})
.ToMap(new Func{public String Op(SomeOtherStruct in){return in.StringField;}},
new Func{public Integer Op(SomeOtherStruct in){return in.IntField;}});
Создание настоящей библиотеки - упражнение, выходящее далеко за рамки ответа на вопросы и ответы в Интернете. Я просто сказал, что это возможно, а не просто.
Деревья выражений - это не ракетостроение, но было бы важным проектом реализовать то, что имеет .NET в этой области; вам нужна не только возможность строить дерево выражений, вы должны уметь «компилировать» это дерево на лету, используя испускаемые байт-коды; Я не знаю, является ли отражение Java настолько мощным.
Видеть:
Нет. Linq требует много функций языка, которые есть в Java
Используйте Scala по причинам, объясненным здесь :
используйте .NET порт Scala. Это дает вам полный нативный доступ ко всему в .NET, который, очевидно, включает в себя LINQ.
Если вы не можете, вы можете попробовать использовать библиотеки libdaj , такие как functionjava или lambdaj , но вы не приблизитесь к LINQ.
Я бы добавил гуаву в список библиотек, которые могут помочь вам достичь некоторых вещей, которые делает LINQ.
Но, как отмечали другие, в чистой Java нет эквивалента.
Вы можете использовать Korma , DSL для SQL-запросов, написанных на Clojure.
Синтаксис довольно аккуратный:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Вы можете легко вызвать это из Java, импортировав соответствующие библиотеки Clojure и просто используя обычное взаимодействие Clojure / Java.
В Java нет встроенной функции, которая имитирует linq. Однако есть несколько API, которые предоставляют одинаковую функциональность.
Например, в этом сообщении в блоге есть специальный jar для репликации linq.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
И это пример использования API из поста:
Предположим, у нас есть объект Animal, содержащий имя и идентификатор, который представлен списком animals
. Если мы хотим получить все имена животных, которые содержат 'o' из списка animals
, мы можем написать следующий запрос
from(animals).where("getName", contains("o")).all();
В публикации блога упоминаются два других API: lambdaJ и jLinq
where("getName", ...)
.