Presumo que você queira dizer "a sintaxe do LINQ" em vez de "a funcionalidade do LINQ". Existem muitas bibliotecas que fornecem a mesma funcionalidade :-)
mikera
O equivalente em Java é provavelmente o Groovy . À custa de perder a segurança de tipos embora
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:
pode converter qualquer entrada Iterável em uma instância LinqIterable
possui métodos para processamento básico de lista, como filtragem, agrupamento, concatenação, interseção, ordenação, etc, que aceitam interfaces de função única e produzem novos LinqIterables, permitindo o encadeamento desses métodos, esperançosamente de uma maneira "preguiçosa".
possui métodos para transformar o LinqIterable novamente em objetos "concretos", como ToList, ToArray, ToMap, etc.
Portanto, você provavelmente poderia definir uma biblioteca "fluente" que permitiria uma declaração como:
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.
Curiosamente, métodos de extensão e expressões lambda estão ambos no Java 8. Talvez o LINQ esteja a caminho?
Lxs
4
Bem, se você tem métodos de extensão e lambdas, possui o lado "Enumerável" do Linq do .NET sem um grande esforço. Ainda será necessário, como eu disse, alterar as especificações Java para permitir as palavras-chave que fazem uma consulta no Linq, mas sinceramente no uso diário do Linq, não encontrei muitas consultas que não fossem tão facilmente expressa como uma cadeia de métodos, e o compilador praticamente converte a sintaxe Linq em cadeias de métodos (existem plugins VS que podem converter 1: 1 entre a maioria das consultas e cadeias). O próximo trampolim real serão as árvores de expressão (Queryable Linq).
/programming/346721/linq-for-java-tool - Há uma menção de que, antes do Java 8, você também pode utilizar as coleções do Google para falsificá-lo e que a linguagem Scala o suporta como um recurso de linguagem ( Scala é outra linguagem popular na JVM).
você se importaria em expandir um pouco o que cada um desses recursos possui e por que os recomenda como resposta à pergunta? "Respostas apenas para links" não são bem-vindas no Stack Exchange
gnat
Hmm, acho que esse caso já foi respondido - deve ser modificado como duplicado?
Martijn Verburg
1
@MartijnVerburg - não podemos marcar perguntas como duplicadas nos sites. As respostas realmente precisam poder ficar sozinhas.
ChrisF
Editado, espero que seja um pouco mais útil agora.
Martijn Verburg
5
Não. O Linq exige muitos recursos de linguagem que o Java apenas possui
Scala não inclui nada como o Linq sem bibliotecas.
Jonas
1
@Jonas: Então? Java não inclui nada como o Linq com bibliotecas.
Back2dos
@ back2dos: Sim, é por isso que você precisa responder com uma biblioteca.
Jonas
1
@Jonas: a biblioteca padrão do Scala é como o LINQ. Ou o contrário: LINQ é apenas um conjunto de expressões funcionais de programação para C #. Mais sobre isso aqui .
back2dos
@ back2dos: Obrigado pelo ótimo link, tomei a liberdade de incluí-lo.
Landei
2
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ê se importaria de explicar mais sobre o que faz e por que o recomenda como resposta à pergunta? "Respostas apenas para links" não são bem-vindas no Stack Exchange
gnat
2
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 "[email protected]"}))
Você pode chamar isso facilmente do Java importando as bibliotecas relevantes do Clojure e apenas usando a interoperabilidade normal do Clojure / Java.
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
Receio que perder tanto a verificação de tipo estático quanto a própria existência de um membro da classe seja um preço um pouco alto para pedir uma ligação where("getName", ...).
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:
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.
fonte
Vejo:
fonte
Não. O Linq exige muitos recursos de linguagem que o Java apenas possui
fonte
Use Scala , pelos motivos explicados aqui :
Se não puder, tente usar as bibliotecas como functionjava ou lambdaj , mas você não chegará muito perto do LINQ.
fonte
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.
fonte
Você pode usar o Korma , um DSL para consultas SQL escritas no Clojure.
A sintaxe é bem organizada:
Você pode chamar isso facilmente do Java importando as bibliotecas relevantes do Clojure e apenas usando a interoperabilidade normal do Clojure / Java.
fonte
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 listaanimals
, podemos escrever a seguinte consultafrom(animals).where("getName", contains("o")).all();
Existem duas outras APIs mencionadas na postagem do blog: lambdaJ e jLinq
fonte
where("getName", ...)
.