¿Hay alguna biblioteca en Java que se acerque a proporcionar la funcionalidad de Linq?
¿Hay alguna biblioteca en Java que se acerque a proporcionar la funcionalidad de Linq?
Respuestas:
Para obtener una sintaxis de consulta LINQ completa, necesitaría una actualización de las especificaciones del lenguaje y compiladores que admitan las nuevas palabras clave y la estructura de sintaxis. Esto está mucho más allá de la mayoría de los lectores aquí.
Para obtener una sintaxis de cadena de método similar a Linq en Java que se ve y funciona como lo que está en C #, necesita dos cosas que Java no admite; métodos de extensión (métodos estáticos que se pueden aplicar a una instancia como si fuera un método de instancia) y expresiones lambda (delegados anónimos). Sin embargo, esos dos pueden ser falsificados con construcciones Java existentes, si está dispuesto a incurrir en un poco de verbosidad de codificación adicional. Una cosa que encuentro particularmente sorprendente sobre Java es la capacidad de crear implementaciones de interfaz anónimas; aplicado a una interfaz con una sola función pura, que básicamente permite delegados anónimos simples, siempre que tenga una interfaz para cada firma de método que necesitará.
Entonces, el lado IEnumerable (Iterable for the Javaheads) de Linq, como una cadena de métodos, debería ser posible aproximarlo en Java; básicamente lo implementaría como una interfaz fluida que controla una mónada. Necesitaría una clase como LinqIterable
, implementando Iterable, que:
Entonces, probablemente podría definir una biblioteca "fluida" que permitiría una declaración como:
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;}});
La creación de la biblioteca real es un ejercicio que va mucho más allá del alcance de una respuesta en una sesión de preguntas y respuestas en Internet. Solo dije que era posible, no fácil.
Los árboles de expresión no son ciencia espacial, pero sería un proyecto significativo para implementar lo que .NET tiene en esta área; no solo necesita la capacidad de construir un árbol de expresión, sino que debe poder "compilar" este árbol sobre la marcha utilizando los códigos de bytes emitidos; No sé si el reflejo de Java es tan poderoso.
Ver:
No. Linq requiere muchas características de lenguaje que Java no tiene
Use Scala , por las razones explicadas aquí :
use el puerto .NET de Scala. Le da acceso nativo completo a todo en .NET, que obviamente incluye LINQ.
Si no puede, puede intentar usar libs como functionjava o lambdaj , pero no se acercará realmente a LINQ.
Agregaría guayaba a la lista de bibliotecas que pueden ayudarlo a lograr algunas de las cosas que hace LINQ.
Pero como otros han señalado, no hay equivalente en Java puro.
Puede usar Korma , un DSL para consultas SQL escritas en Clojure.
La sintaxis es bastante clara:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Puede llamar a esto con bastante facilidad desde Java importando las bibliotecas Clojure relevantes y simplemente usando la interoperabilidad Clojure / Java normal.
No hay una característica nativa en Java que imite linq. Sin embargo, hay varias API que proporcionan la misma funcionalidad.
Por ejemplo, esta publicación de blog tiene un jar personalizado para replicar linq.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
Y este es un ejemplo de uso de la API de la publicación:
Supongamos que tenemos un objeto Animal que contiene nombre e ID que se representa con una lista de animals
. Si queremos obtener todos los nombres de animales que contienen 'o' de la lista animals
, podemos escribir la siguiente consulta
from(animals).where("getName", contains("o")).all();
Hay otras dos API a las que se hace referencia en la publicación del blog: lambdaJ y jLinq
where("getName", ...)
.