Existem bibliotecas em Java que chegam perto de fornecer a funcionalidade do Linq?
Existem bibliotecas em Java que chegam perto de fornecer a funcionalidade do Linq?
Respostas:
Para obter a sintaxe completa da consulta LINQ, você precisaria de uma atualização para as especificações e os compiladores de idioma que suportam as novas palavras-chave e estrutura de sintaxe. Isso está muito além da maioria dos leitores aqui.
Para obter a sintaxe da cadeia de método semelhante ao Linq em Java, que se parece e funciona como o que está em C #, você precisa de duas coisas que o Java não suporta; métodos de extensão (métodos estáticos que podem ser aplicados a uma instância como se fosse um método de instância) e expressões lambda (delegados anônimos). No entanto, esses dois podem ser falsificados com construções Java existentes, se você desejar incorrer em um pouco de detalhamento de codificação. Uma coisa que acho particularmente surpreendente sobre Java é a capacidade de criar implementações de interface anônimas; aplicado a uma interface com uma única função pura, que basicamente permite delegados anônimos simples, desde que você tenha uma interface para cada assinatura de método necessária.
Portanto, o lado IEnumerable (Iterable for the Javaheads) do Linq, como uma cadeia de métodos, deve ser possível aproximar em Java; você basicamente o implementaria como uma interface fluente que controla uma mônada. Você precisaria de uma classe como a LinqIterable
, implementando Iterable, que:
Portanto, você provavelmente poderia definir uma biblioteca "fluente" que permitiria uma declaração 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;}});
A criação da biblioteca real é um exercício muito além do escopo de uma resposta nas perguntas e respostas na Internet. Eu apenas disse que era possível, não fácil.
As árvores de expressão não são ciência de foguetes, mas seria um projeto significativo para implementar o que o .NET possui nessa área; não é necessário apenas a capacidade de construir uma árvore de expressão, mas também a capacidade de "compilar" rapidamente a árvore usando bytecodes emitidos; Não sei se o reflexo de Java é tão poderoso.
Vejo:
Não. O Linq exige muitos recursos de linguagem que o Java apenas possui
Use Scala , pelos motivos explicados aqui :
use a porta .NET do Scala. Dá a você acesso nativo completo a tudo no .NET, o que obviamente inclui o LINQ.
Se não puder, tente usar as bibliotecas como functionjava ou lambdaj , mas você não chegará muito perto do LINQ.
Eu adicionaria goiaba à lista de bibliotecas que podem ajudá-lo a alcançar algumas das coisas que o LINQ faz.
Mas, como outros já apontaram, não há equivalente em Java puro.
Você pode usar o Korma , um DSL para consultas SQL escritas no Clojure.
A sintaxe é bem organizada:
(select user
(with address)
(fields :firstName :lastName :address.state)
(where {:email "korma@sqlkorma.com"}))
Você pode chamar isso facilmente do Java importando as bibliotecas relevantes do Clojure e apenas usando a interoperabilidade normal do Clojure / Java.
Não há um recurso nativo em java que imite o linq. No entanto, existem várias APIs que fornecem a mesma funcionalidade.
Por exemplo, esta postagem do blog possui um jar personalizado para replicar o linq.
http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
E este é um exemplo de uso da API da postagem:
Suponha que tenhamos um objeto Animal contendo nome e ID que é representado com uma lista de animals
. Se queremos obter todos os nomes de animais que contêm 'o' da lista animals
, podemos escrever a seguinte consulta
from(animals).where("getName", contains("o")).all();
Existem duas outras APIs mencionadas na postagem do blog: lambdaJ e jLinq
where("getName", ...)
.