Чи є на Яві бібліотеки, які наближаються до надання функціональності Linq?
Чи є на Яві бібліотеки, які наближаються до надання функціональності Linq?
Відповіді:
Щоб отримати повний синтаксис запитів LINQ, вам знадобиться оновлення специфікації мови та компіляторів, що підтримують нові ключові слова та структуру синтаксису. Це далеко поза більшості читачів.
Для того, щоб отримати синтаксис синтаксису ланцюга методів у Java, який виглядає і працює як те, що в C #, вам потрібно дві речі, які Java не підтримує; методи розширення (статичні методи, які можна застосувати до екземпляра, як якщо б це був метод екземпляра), і лямбда-вирази (анонімні делегати). Тим не менше, ці два можуть бути підроблені існуючими конструкціями Java, якщо ви бажаєте зазнати трохи додаткового багатослівного кодування. Одне, що мене особливо вражає щодо Java, - це можливість створювати анонімні реалізації інтерфейсу; застосовано до інтерфейсу з єдиною чистою функцією, яка в основному дозволяє прості анонімні делегати, якщо у вас є інтерфейс для кожного підпису методу, який вам знадобиться.
Отже, сторона Linq (Iterable для Javaheads) Linq, як ланцюжок методів, повинна мати можливість наближення в Java; ви в основному реалізуєте це як вільний інтерфейс, який управляє монадою. Вам потрібен такий клас, як 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 має у цій галузі; не тільки вам потрібна здатність будувати дерево виразів, ви повинні вміти «складати» це дерево на льоту, використовуючи випромінювані байт-коди; Я не знаю, чи відображення Яви настільки сильне.
Побачити:
Ні. Linq вимагає безлічі функцій, які мають лише Java
Використовуйте Scala з пояснених тут причин :
використовувати порт .NET Scala. Він надає повний вихідний доступ до всього в .NET, що, очевидно, включає LINQ.
Якщо ви не можете, ви можете спробувати використовувати libs, як functionjava або lambdaj , але ви не наблизитесь до LINQ.
Я додав би guava до списку бібліотек, які можуть допомогти вам досягти деяких речей, які робить LINQ.
Але як зазначали інші, у чистої Java немає еквівалента.
Ви можете використовувати Корму , DSL для запитів SQL, написаних у Clojure.
Синтаксис досить акуратний:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Ви можете легко зателефонувати до цього з Java, імпортуючи відповідні бібліотеки Clojure та просто скориставшись звичайним інтеропом Clojure / Java.
У Java не існує рідної функції, яка імітує linq. Однак існує кілька API, які забезпечують однаковий функціонал.
Наприклад, у цій публікації в блозі є спеціальна баночка для копіювання 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", ...)
.