@craastad Como um cara do .NET agora preso principalmente no mundo Java, sinto sua dor. Você deve experimentar o Scala - funções / fechamentos de primeira classe, para compreensão (não a mesma sintaxe de consulta do LINQ, mas útil em muitas das mesmas situações), um sistema unificado de tipos, inferência de tipos, algumas soluções práticas para eliminação de tipos genéricos ... tudo rodando na JVM, interoperando com Java. Além de um monte de outras bondade funcional como correspondência de padrões, tipo Option, etc.
Tim Goodman
Respostas:
808
Não há nada como LINQ for Java.
...
Editar
Agora, com o Java 8, somos apresentados à API Stream , esse é um tipo de coisa semelhante ao lidar com coleções, mas não é exatamente o mesmo que Linq.
Se você procura um ORM, como o Entity Framework, pode tentar o Hibernate
existe algo no plano? integrado ao idioma? Existe um número JCP? etc etc
Cheeso
6
Muito verdadeiro, embora uma grande parte do que faz LINQ sooo nice é o quão profundamente ele é integrado a linguagem e compilador
AgileJon
11
Desculpe, o 'true' foi criado para o 280Z28. Não sei se existe um JCP para isso. O LINQ exigiu várias alterações na linguagem C #, dada a velocidade em que o JCP trabalha, eu não prendia a respiração.
O LINQ é uma especificação, não uma implementação ... As expressões lambda fazem parte do LINQ. Todos os projetos que tentam portar o LINQ para Java são implementações para um cenário concreto (SQL, Objetos ...), mas não representam o objetivo principal do LINQ: Integrar a consulta de idioma no código. Por esse motivo, não há alternativa real nem iniciativa, por enquanto, que possa ser considerada uma alternativa.
O Coolection não pretende ser o novo lambda, no entanto, estamos rodeados por projetos Java antigos e antigos, nos quais essa biblioteca ajudará. É realmente simples de usar e estender, cobrindo apenas as ações de iteração mais usadas em coleções, assim:
A string para o nome da coluna, o que significa que o compilador e o preenchimento automático do IDE não ajudarão contra erros de digitação e a refatoração é difícil. Algum plano para mudar isso?
Ekevoo
2
Olá Ekevoo. Eu acho que será fantástico e tentei fazer isso algum dia. Mas, neste momento, com o Java 8, a Coollection é uma lib obsoleta. Talvez seja útil para projetos mais antigos ... O que você acha?
19WAS85
1
@WagnerAndrade O último commit é de 5-6 anos atrás. Estou assumindo que a funcionalidade foi amplamente substituída pelo Java 8? Além disso, muito legal nome :)
Leia os artigos de Brian Goetz relacionados aos lambdas para um entendimento decente de como as lambdas são implementadas no JDK8 e, ao mesmo tempo, obtenha um entendimento de fluxos, iteração interna, curto-circuito e referências de construtores. Verifique também as JSRs acima para obter mais exemplos .
Os lambdas também não estavam programados para estar no Java 7? O que aconteceu com aquilo?
BlueRaja - Danny Pflughoeft 11/11
7
A Oracle comprou a Sun (língua na bochecha). O Java 7 estava demorando muito (5 anos), então as lambdas perderam a lista curta, o que foi bastante decepcionante para as massas. Dito isto, a Oracle parece estar pegando a bola e acho que estamos programados para Java em 8 de outubro do próximo ano.
Brett Ryan
1
Observe que o estado do Lambda foi atualizado mais uma vez, que agora abrange referências de fluxos, iteração interna, curto-circuito e construtor. Aconselho a todos que leiam o novo documento.
Brett Ryan #
6
Expressões lambda são uma pequena parte do LINQ.
precisa saber é o seguinte
4
@NeWNeO, se você está se referindo à linguagem de consulta em C #, então sim, nada disso está chegando ao Java, no entanto, na minha experiência, os desenvolvedores mais experientes de C # preferem a sintaxe lambda sobre a linguagem de consulta. No entanto, se você estiver se referindo a LINQ-to-Entities, por exemplo, verá que lambdas em java ativará isso e muito mais. Há muito mais disponível no Java 8 para habilitar isso, como métodos de defesa .
Brett Ryan,
119
Você pode selecionar os itens em uma coleção (e muito mais) de uma maneira mais legível usando a biblioteca lambdaj
Ele tem algumas vantagens sobre a biblioteca Quaere porque não usa nenhuma string mágica, é completamente seguro para o tipo e, na minha opinião, oferece uma DSL mais legível.
O github.com/TrigerSoft/jaque foi encontrado dessa maneira e vamos criar Árvores de Expressão. Combinado com o Java 8 Lambdas, qualquer capacidade LINQ pode ser implementada com o mesmo esforço que em .Net.
LINQ para SQL / NHibernate / etc. (consulta ao banco de dados) - Uma opção seria usar o JINQ, que também usa os novos recursos do JAVA 8 e foi lançado em 26 de fevereiro de 2014 no Github: https://github.com/my2iu/Jinq
O Jinq fornece aos desenvolvedores uma maneira fácil e natural de escrever consultas de banco de dados em Java. Você pode tratar dados do banco de dados como objetos Java normais armazenados em coleções. Você pode iterá-los e filtrá-los usando comandos Java normais, e todo o seu código será convertido automaticamente em consultas otimizadas ao banco de dados. Finalmente, as consultas no estilo LINQ estão disponíveis para Java!
Não sei por que os leitores não prestaram atenção à sua resposta, embora a API do Stream seja a mais próxima do LINQ!
Rafid
3
A API do Streams é uma piada de mau gosto em comparação com o LINQ.
Andrei Rînea
1
Desculpe cara, não quero ser rude. Eu estava procurando por um equivalente em LINQ depois de bater na cabeça com a API de fluxos. eu só queria dizer que não é um equivalente real, só isso.
Andrei Rînea 7/08
1
@ AndreiRînea Você está procurando a funcionalidade equivalente de provedores LINQ (LINQ to XML, LINQ to JSON, LINQ to NHibernate, etc.)?
Răzvan Flavius Panda
2
Tudo o que eu precisava era de um meio para agrupar e maximizar uma coleção .. Acabei conseguindo, mas com muito esforço e muito código.
Quaere parece que fornece um pouco do que LINQ fornece, mas a questão é para um 'equivalente'
AgileJon
6
Então é algo como LINQ, se não um equivalente direto? Que pelo menos soa útil
Brian Agnew
3
@AgileJon: Se ele realmente quis dizer equivalente, ele não teria perguntado. Ele poderia ter digitado from x in xs select xe descoberto a resposta (não).
kizzx2
18
Existem muitos equivalentes LINQ para Java, veja aqui para uma comparação.
Para uma estrutura de estilo Quaere / LINQ tipesafe, considere usar Querydsl . O Querydsl suporta coleções JPA / Hibernate, JDO, SQL e Java.
Eu sou o mantenedor do Querydsl, então essa resposta é tendenciosa.
Agora que o Java 8 suporta lambdas, é possível criar APIs Java que se assemelham ao LINQ.
Jinq é uma dessas novas bibliotecas no estilo LINQ para Java.
Eu sou o desenvolvedor desta biblioteca. Ele se baseia em cinco anos de pesquisa sobre o uso da análise de bytecode para converter Java em consultas ao banco de dados. Semelhante ao modo como o D-LINQ do C # é uma camada de consulta que fica no topo do Entity Framework, o Jinq é capaz de atuar como uma camada de consulta no JPA ou no jOOQ. Possui suporte para agregação, grupos e subconsultas. Até Erik Meijer (o criador do LINQ) reconheceu Jinq .
Veja SBQL4J . É uma linguagem de consulta segura e segura para tipos, integrada ao Java. Permite escrever consultas complicadas e multiplicadas. Existem muitos operadores, métodos Java podem ser chamados dentro de consultas, assim como construtores. As consultas são convertidas em código Java puro (não há reflexão no tempo de execução), portanto, a execução é muito rápida.
EDIT: Bem, até agora o SBQL4J é a única extensão da linguagem Java que fornece recursos de consulta semelhantes ao LINQ. Existem projetos interessantes como Quaere e JaQue, mas eles são apenas APIs, não extensões de sintaxe / semântica com forte segurança de tipo em tempo de compilação.
List<String> parts =newArrayList<String>();// add parts to the collection. FluentIterable<Integer> partsStartingA =FluentIterable.from(parts).filter(newPredicate<String>(){@Overridepublicboolean apply(finalString input){return input.startsWith("a");}}).transform(newFunction<String,Integer>(){@OverridepublicInteger apply(finalString input){return input.length();}});
Parece ser uma extensa biblioteca para Java. Certamente não é tão sucinto quanto o LINQ, mas parece interessante.
Você pode experimentar minha biblioteca CollectionsQuery . Permite executar LINQ como consultas sobre coleções de objetos. Você precisa passar o predicado, assim como no LINQ. Se você estiver usando o java6 / 7, precisará usar a sintaxe antiga do Interfaces:
Se você precisar executar consultas ao banco de dados, poderá procurar no JINQ, como mencionado acima, mas não pode ser portado pelo RetroLambda, doe para usar lambdas serializadas.
Apenas para adicionar outra alternativa: o Java 6 tem uma solução para consultas de banco de dados com segurança de tipo usando o pacote javax.persistence.criteria .
Embora eu deva dizer que esse não é realmente o LINQ, porque com o LINQ você pode consultar qualquer IEnumerable.
Parece que o Linq que todo mundo está falando aqui é apenas LinqToObjects. Acredito que apenas oferece funcionalidades que já podem ser realizadas hoje em Java, mas com sintaxe realmente feia.
O que vejo como o verdadeiro poder do Linq no .Net é que as expressões lambda podem ser usadas em um contexto que exija um Delegado ou uma Expressão e serão compiladas no formato apropriado. É isso que permite que coisas como o LinqToSql (ou qualquer outra coisa que não seja o LinqToObjects) funcionem e permite que eles tenham uma sintaxe idêntica ao LinqToObjects.
Parece que todos os projetos mencionados acima oferecem apenas os recursos do LinqToObjects. O que me faz pensar que a funcionalidade do tipo LinqToSql não está no horizonte para Java.
Para coleções funcionais básicas, o Java 8 foi incorporado, a maioria das principais linguagens JVM não Java (Scala, Clojure etc.), e você pode adicionar bibliotecas para versões anteriores do Java.
Para acesso integrado ao idioma completo de um banco de dados SQL, o Scala (executado na JVM) possui o Slick
Para LINQ (LINQ to Objects), o Java 8 terá algo equivalente, consulte Projeto Lambda .
Ele possui extensões LINQ to Objects do Enumerable, como animais . Mas, para coisas LINQ mais complicadas, como Expression e ExpressionTree (elas são necessárias para o LINQ to SQL e outros provedores LINQ, se eles desejam fornecer algo otimizado e real), ainda não há nenhum equivalente, mas talvez veremos isso no futuro :)
Mas acho que não haverá nada como consultas declarativas em Java no futuro.
Não existe esse recurso no java. Ao usar a outra API, você obterá esse recurso. Como suponha que tenhamos um objeto animal contendo nome e id. Temos um objeto de lista com objetos de animais. Agora, se queremos obter todo o nome do animal que contém 'o' do objeto da lista. podemos escrever a seguinte consulta
JaQu é o equivalente em LINQ para Java. Embora tenha sido desenvolvido para o banco de dados H2, ele deve funcionar para qualquer banco de dados, pois usa o JDBC.
Talvez não seja a resposta que você está procurando, mas se alguma parte do seu código precisar de muito trabalho em coleções (pesquisa, classificação, filtragem, transformações, análises), você pode considerar escrever algumas aulas no Clojure ou Scala .
Devido à sua natureza funcional, é melhor trabalhar com coleções. Não tenho muita experiência com o Scala, mas com o Clojure você provavelmente encontraria um Linq mais poderoso ao seu alcance e, uma vez compiladas, as classes que você produziria se integrariam perfeitamente ao restante da base de código.
Diting é uma biblioteca de classes que fornece recursos de consulta em coleções através de métodos encadeados e interface anônima como Linq no .NET. Diferentemente da maioria das outras bibliotecas de coleções, aqueles que estão usando métodos estáticos precisam repetir a coleção inteira, Diting fornece uma classe Enumerable principal, que contém métodos encadeados diferidos para implementar a consulta na coleção ou matriz.
O Scala precisa de um tempo de execução Java para ser executado: ele não necessariamente funcionará em uma instalação simples do Linux, dependendo de quais componentes você instala.
Rup 03/03
@Rup há totalmente compatível JRE para o GNU / Linux, e Mono é não um totalmente compatível implementação do .NET.
Exibir nome
@ Sarge Esse não era o meu ponto, mas o Mono roda LINQ o suficiente, não é? Além disso, agora existe o .Net Core da Microsoft para Linux .
Rup
(GNU /) O Linux não é a única plataforma além do Windows, e o JRE existe para uma grande variedade de plataformas. O Mono não implementa tudo totalmente, por exemplo, não há WPF.
Exibir nome
0
Havia a linguagem de programação Pizza (uma extensão Java) e você deveria dar uma olhada nela. - Utiliza o conceito de "interfaces fluentes" para consultar dados de maneira declarativa e, em princípio, idêntico ao LINQ sem expressões de consulta (http://en.wikipedia.org/wiki/Pizza_programming_language). Mas, infelizmente, não foi buscado, mas teria sido uma maneira de obter algo semelhante ao LINQ no Java.
Claro que foi perseguido, mas não com o nome "Pizza". Os genéricos do Pizza foram mesclados ao GJ, que se tornou o compilador de referência do Java 1.3 (embora os genéricos estivessem ocultos atrás de uma flag até 1,5). Enquanto isso ... o restante das idéias, mais algumas extras, tornou-se Scala.
Kevin Wright
Obrigado por essa informação, é claro que Scala é um bom ponto aqui. Mas essas habilidades não foram integradas à linguagem Java. Você pode usar a linguagem Scala para implementar o bom código de consulta e usar o binário resultante e depois em Java.
Respostas:
Não há nada como LINQ for Java.
...
Editar
Agora, com o Java 8, somos apresentados à API Stream , esse é um tipo de coisa semelhante ao lidar com coleções, mas não é exatamente o mesmo que Linq.
Se você procura um ORM, como o Entity Framework, pode tentar o Hibernate
:-)
fonte
Existe uma solução alternativa, Coollection .
O Coolection não pretende ser o novo lambda, no entanto, estamos rodeados por projetos Java antigos e antigos, nos quais essa biblioteca ajudará. É realmente simples de usar e estender, cobrindo apenas as ações de iteração mais usadas em coleções, assim:
fonte
Agora, as lambdas estão disponíveis no Java 8 na forma de JSR-335 - Expressões lambda para a linguagem de programação JavaTM
ATUALIZAÇÃO : O JDK8 foi lançado agora que contém o projeto lambda. Vale a pena pegar uma cópia do Java 8 in Action atualmente ainda MEAP.
Leia os artigos de Brian Goetz relacionados aos lambdas para um entendimento decente de como as lambdas são implementadas no JDK8 e, ao mesmo tempo, obtenha um entendimento de fluxos, iteração interna, curto-circuito e referências de construtores. Verifique também as JSRs acima para obter mais exemplos .
Eu escrevi um blog sobre algumas das vantagens de usar lambdas no JDK8, chamado The Power of the Arrow , também o NetBeans 8 tem um ótimo suporte para converter construções em JDK8, que também escrevi sobre a migração para o JDK 8 com o NetBeans .
fonte
Você pode selecionar os itens em uma coleção (e muito mais) de uma maneira mais legível usando a biblioteca lambdaj
https://code.google.com/archive/p/lambdaj/
Ele tem algumas vantagens sobre a biblioteca Quaere porque não usa nenhuma string mágica, é completamente seguro para o tipo e, na minha opinião, oferece uma DSL mais legível.
fonte
Você não encontrará um equivalente ao LINQ, a menos que use o javacc para criar seu próprio equivalente.
Até aquele dia em que alguém encontra uma maneira viável de fazer isso, existem algumas boas alternativas, como
fonte
LINQ to Objects - O JAVA 8 adicionou a API Stream, que adiciona suporte para operações de estilo funcional em fluxos de valores:
Pacote java.util.stream
Java 8 Explicado: Aplicando Lambdas a Coleções Java
LINQ para SQL / NHibernate / etc. (consulta ao banco de dados) - Uma opção seria usar o JINQ, que também usa os novos recursos do JAVA 8 e foi lançado em 26 de fevereiro de 2014 no Github: https://github.com/my2iu/Jinq
Site do projeto JINQ: http://www.jinq.org/
fonte
Existe um projeto chamado quaere .
É uma estrutura Java que adiciona a capacidade de consultar coleções.
Nota: Segundo o autor, o projeto não é mais mantido.
fonte
from x in xs select x
e descoberto a resposta (não).Existem muitos equivalentes LINQ para Java, veja aqui para uma comparação.
Para uma estrutura de estilo Quaere / LINQ tipesafe, considere usar Querydsl . O Querydsl suporta coleções JPA / Hibernate, JDO, SQL e Java.
Eu sou o mantenedor do Querydsl, então essa resposta é tendenciosa.
fonte
você pode usar scala, é semelhante em sintaxe e é provavelmente mais poderoso que o linq.
fonte
Como em 2014, posso finalmente dizer que o LINQ finalmente está lá no java 8. Portanto, não há mais necessidade de encontrar uma alternativa ao LINQ.
fonte
Agora que o Java 8 suporta lambdas, é possível criar APIs Java que se assemelham ao LINQ.
Jinq é uma dessas novas bibliotecas no estilo LINQ para Java.
Eu sou o desenvolvedor desta biblioteca. Ele se baseia em cinco anos de pesquisa sobre o uso da análise de bytecode para converter Java em consultas ao banco de dados. Semelhante ao modo como o D-LINQ do C # é uma camada de consulta que fica no topo do Entity Framework, o Jinq é capaz de atuar como uma camada de consulta no JPA ou no jOOQ. Possui suporte para agregação, grupos e subconsultas. Até Erik Meijer (o criador do LINQ) reconheceu Jinq .
fonte
Veja SBQL4J . É uma linguagem de consulta segura e segura para tipos, integrada ao Java. Permite escrever consultas complicadas e multiplicadas. Existem muitos operadores, métodos Java podem ser chamados dentro de consultas, assim como construtores. As consultas são convertidas em código Java puro (não há reflexão no tempo de execução), portanto, a execução é muito rápida.
EDIT: Bem, até agora o SBQL4J é a única extensão da linguagem Java que fornece recursos de consulta semelhantes ao LINQ. Existem projetos interessantes como Quaere e JaQue, mas eles são apenas APIs, não extensões de sintaxe / semântica com forte segurança de tipo em tempo de compilação.
fonte
Implementação de Java LINQ to SQL . Fornece integração completa de idiomas e maior conjunto de recursos em comparação com o .NET LINQ.
fonte
Eu tentei bibliotecas de goiaba do google. Ele tem um
FluentIterable
que eu acho que é próximo ao LINQ. Consulte também FunctionalExplained .Parece ser uma extensa biblioteca para Java. Certamente não é tão sucinto quanto o LINQ, mas parece interessante.
fonte
https://code.google.com/p/joquery/
Suporta diferentes possibilidades,
Dada a coleção,
do tipo
Filtro
Java 7
Java 8
Além disso,
Classificação (também disponível para o Java 7)
Agrupamento (também disponível para o Java 7)
Junções (também disponíveis para o Java 7)
Dado,
Pode ser juntado como,
Expressões
fonte
Você pode experimentar minha biblioteca CollectionsQuery . Permite executar LINQ como consultas sobre coleções de objetos. Você precisa passar o predicado, assim como no LINQ. Se você estiver usando o java6 / 7, precisará usar a sintaxe antiga do Interfaces:
Você também pode usá-lo no Java8, ou no java antigo com RetroLambda e seu plug-in gradle , para ter uma nova sintaxe sofisticada:
Se você precisar executar consultas ao banco de dados, poderá procurar no JINQ, como mencionado acima, mas não pode ser portado pelo RetroLambda, doe para usar lambdas serializadas.
fonte
Apenas para adicionar outra alternativa: o Java 6 tem uma solução para consultas de banco de dados com segurança de tipo usando o pacote javax.persistence.criteria .
Embora eu deva dizer que esse não é realmente o LINQ, porque com o LINQ você pode consultar qualquer IEnumerable.
fonte
Há uma biblioteca muito boa que você pode usar para isso.
Localizado aqui: https://github.com/nicholas22/jpropel-light
Porém, o Lambdas não estará disponível até o Java 8, portanto, usá-lo é um pouco diferente e não parece tão natural.
fonte
Parece que o Linq que todo mundo está falando aqui é apenas LinqToObjects. Acredito que apenas oferece funcionalidades que já podem ser realizadas hoje em Java, mas com sintaxe realmente feia.
O que vejo como o verdadeiro poder do Linq no .Net é que as expressões lambda podem ser usadas em um contexto que exija um Delegado ou uma Expressão e serão compiladas no formato apropriado. É isso que permite que coisas como o LinqToSql (ou qualquer outra coisa que não seja o LinqToObjects) funcionem e permite que eles tenham uma sintaxe idêntica ao LinqToObjects.
Parece que todos os projetos mencionados acima oferecem apenas os recursos do LinqToObjects. O que me faz pensar que a funcionalidade do tipo LinqToSql não está no horizonte para Java.
fonte
Para coleções funcionais básicas, o Java 8 foi incorporado, a maioria das principais linguagens JVM não Java (Scala, Clojure etc.), e você pode adicionar bibliotecas para versões anteriores do Java.
Para acesso integrado ao idioma completo de um banco de dados SQL, o Scala (executado na JVM) possui o Slick
fonte
Para LINQ (LINQ to Objects), o Java 8 terá algo equivalente, consulte Projeto Lambda .
Ele possui extensões LINQ to Objects do Enumerable, como animais . Mas, para coisas LINQ mais complicadas, como Expression e ExpressionTree (elas são necessárias para o LINQ to SQL e outros provedores LINQ, se eles desejam fornecer algo otimizado e real), ainda não há nenhum equivalente, mas talvez veremos isso no futuro :)
Mas acho que não haverá nada como consultas declarativas em Java no futuro.
fonte
Não existe esse recurso no java. Ao usar a outra API, você obterá esse recurso. Como suponha que tenhamos um objeto animal contendo nome e id. Temos um objeto de lista com objetos de animais. Agora, se queremos obter todo o nome do animal que contém 'o' do objeto da lista. podemos escrever a seguinte consulta
from(animals).where("getName", contains("o")).all();
A instrução Query acima listará os animais que contêm o alfabeto 'o' em seu nome. Mais informações, visite o blog a seguir. http://javaworldwide.blogspot.in/2012/09/linq-in-java.html
fonte
Confira tiny-q . (Observe que você não pode baixá-lo no momento.)
Aqui está um exemplo adaptado no link acima:
fonte
JaQu é o equivalente em LINQ para Java. Embora tenha sido desenvolvido para o banco de dados H2, ele deve funcionar para qualquer banco de dados, pois usa o JDBC.
fonte
Talvez não seja a resposta que você está procurando, mas se alguma parte do seu código precisar de muito trabalho em coleções (pesquisa, classificação, filtragem, transformações, análises), você pode considerar escrever algumas aulas no Clojure ou Scala .
Devido à sua natureza funcional, é melhor trabalhar com coleções. Não tenho muita experiência com o Scala, mas com o Clojure você provavelmente encontraria um Linq mais poderoso ao seu alcance e, uma vez compiladas, as classes que você produziria se integrariam perfeitamente ao restante da base de código.
fonte
Um usuário anônimo mencionou outro, Diting :
fonte
Agora eu li e comecei a ler como linq, mas mais simples e mais ilegível. mas o scala pode rodar no linux, sim? csharp precisa mono.
fonte
Havia a linguagem de programação Pizza (uma extensão Java) e você deveria dar uma olhada nela. - Utiliza o conceito de "interfaces fluentes" para consultar dados de maneira declarativa e, em princípio, idêntico ao LINQ sem expressões de consulta (http://en.wikipedia.org/wiki/Pizza_programming_language). Mas, infelizmente, não foi buscado, mas teria sido uma maneira de obter algo semelhante ao LINQ no Java.
fonte
Não há equivalente ao LINQ for Java. Mas há algumas API externas que se parecem com LINQ, como https://github.com/nicholas22/jpropel-light , https://code.google.com/p/jaque/
fonte
você pode experimentar esta biblioteca: https://code.google.com/p/qood/
Aqui estão alguns motivos para usá-lo:
fonte