Como ler um arquivo em Java com apenas 1 linha de código

40 views
Skip to first unread message

Hildeberto Mendonça

unread,
Feb 27, 2015, 7:29:33 AM2/27/15
to CEJUG Discussão
Só é possível mostrar como ler um arquivo em Java com apenas 1 linha de código na figura em anexo :-)

Como fazer o mesmo em Clojure ?

(slurp "manifest.mf")

--
Hildeberto Mendonça, Ph.D
Blog: http://www.hildeberto.com
Community: http://www.cejug.net
Twitter: https://twitter.com/htmfilho
java-io.png

Paulo Henrique Alves

unread,
Feb 27, 2015, 7:42:20 AM2/27/15
to ce...@googlegroups.com

new Scanner(new File("manifest.mf")).useDelimiter("\\Z").next();

:p

--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.

Roberto Coelho

unread,
Feb 27, 2015, 7:42:46 AM2/27/15
to [CEJUG]
+1 :)

Atenciosamente:  

Roberto Coelho

Web Designer  Ifactory Solutions  | betoweb.com.br

Hildeberto Mendonça

unread,
Feb 27, 2015, 8:24:15 AM2/27/15
to CEJUG Discussão
2015-02-27 13:42 GMT+01:00 Paulo Henrique Alves <paulohen...@gmail.com>:

new Scanner(new File("manifest.mf")).useDelimiter("\\Z").next();


Não roda Paulo. Precisa colocar numa classe, depois dentro de um método e fazer os imports ainda. :D

Jocelio Lima

unread,
Feb 27, 2015, 8:37:15 AM2/27/15
to ce...@googlegroups.com
Se não for widescreen não rola nem em java kkk

--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att,
     Jocélio Lima

Hildeberto Mendonça

unread,
Feb 27, 2015, 8:40:22 AM2/27/15
to CEJUG Discussão
2015-02-27 14:37 GMT+01:00 Jocelio Lima <joce...@gmail.com>:
Se não for widescreen não rola nem em java kkk

Tive que diminuir a fonte para 8 e maximizar o editor :D

Fabrício Cabral

unread,
Feb 27, 2015, 9:03:19 AM2/27/15
to ce...@googlegroups.com
Isto é uma das coisas que sinto falta em Java. Você não pode dar nem um
System.out.println() sem ter que colocar os imports, declarar a classe, colocar
um main()... até para ensinar a linguagem de programação (para quem não
tem experiência com programação) fica complicado.

At.te.

--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
--fx

Virgilio Ximenes

unread,
Feb 27, 2015, 9:05:49 AM2/27/15
to ce...@googlegroups.com
Hildeberto, mas aí que tá, é aquela linha tênue que diz que quando uma linguagem é boa de escrever e/ou ler (writability/readability).
Por exemplo: Java é verboso, mas é muito fácil você ler e entender, Clojure é bom para escrever, mas para ler não é tão facil, afinal, não é todos que entendem que slurp é para ler um arquivo.

Dúvida pessoal: slurp é algum acrônimo?

--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Atenciosamente,
Virgílio Rocha Ximenes

Paulo Jr.

unread,
Feb 27, 2015, 9:13:14 AM2/27/15
to CEJUG
Desculpa galera, mas é um comparação pra lá de injusta né. Estão reclamando de uma coisa em uma linguagem que não foi feita e nem evoluida pra isso. Java não é dynamic typed, não é de linguagem de script e nem se propõe a ser a linguagem mais prática do mundo.

Java é assim como é, quem gosta, gosta quem não gosta tem trilhares de opções por aí, Clojure inclusive. Para o bem ou para o mal, é o que faz a linguagem ser o que é hoje.

Comparar linguagens com características completamente diferente chega a ser desleal. Posso botar uma linha de html5 que vira o navegador de cabeça pra baixo e dizer que Java não faz isso, ou mesmo de PHP que em 1 linha faz coisas que em java precisaria de umas 5 ou mais.

PS: Acho que o Hildeberto fez mais pra tirar uma onda, mas as comparações começaram e como disse, não vejo propósito nisso.
Paulo Alves Junior
Twitter: @paulojribp
Github: http://github.com/paulojribp
Instrutor - Caelum | Ensino e Inovação
Hurraa - OpenSource project to resource management

Paulo Henrique Alves

unread,
Feb 27, 2015, 9:22:47 AM2/27/15
to ce...@googlegroups.com
A idéia era descontrair.. Mandei a linha de sacanagem.

Cada linguagem tem seus prós e contras.. Acredito que o importante é o algoritmo e o desempenho por trás da coisa.


---
Atenciosamente,
Paulo H3nrique Alves
It is not necessary to do extraordinary things to get extraordinary results. (W. Buffett)

Hildeberto Mendonça

unread,
Feb 27, 2015, 9:22:48 AM2/27/15
to CEJUG Discussão
Virgilio,

2015-02-27 15:05 GMT+01:00 Virgilio Ximenes <virgilio...@gmail.com>:
Hildeberto, mas aí que tá, é aquela linha tênue que diz que quando uma linguagem é boa de escrever e/ou ler (writability/readability).
Por exemplo: Java é verboso, mas é muito fácil você ler e entender, Clojure é bom para escrever, mas para ler não é tão facil, afinal, não é todos que entendem que slurp é para ler um arquivo.

Nao é mais fácil de ler Java do que Clojure... A diferenca é que estamos acostumados com Java e nem um pouco com Clojure. Em Java, é preciso memorizar muuuuuuito mais coisa do que em Clojure. Cada elemento desse código de exemplo em Java foi preciso aprender para o que servia e como usar. Imagine uma pessoa que ainda nao sabe programar. Mostre a versao em Java e depois a versao em Clojure. Depois pessa para ela explicar. Em clojure nao tem o que explicar. É auto explicativo.
 

Dúvida pessoal: slurp é algum acrônimo?

slurp nao é acrônimo. É uma palavra em inglês que significa "mastigar verozmente" hahahaha :D Eu me divirto demais com essa linguagem :D

Fabrício Cabral

unread,
Feb 27, 2015, 9:23:52 AM2/27/15
to ce...@googlegroups.com
Paulo,

concordo com tudo que você disse, mas que Java poderia *pelo menos* criar uma classe e um main()
default em um arquivo quando não encontrasse estes (que nem adiciona um construtor default), acho
que poderia, não? Ia facilitar muito para quem estivesse começando a aprender a programar...

At.te.

joaosi...@gmail.com

unread,
Feb 27, 2015, 9:30:36 AM2/27/15
to ce...@googlegroups.com

Jocelio Lima

unread,
Feb 27, 2015, 9:30:59 AM2/27/15
to ce...@googlegroups.com
Pra adicionar um main() dinamicamente ele teria que também adicionar possíveis throws, o que já complicaria bastante as coisas, quando se pensa nos 4 pilares da OO se percebe melhor a dificuldade que seria fazer isso.
Att,
     Jocélio Lima

Hildeberto Mendonça

unread,
Feb 27, 2015, 9:38:39 AM2/27/15
to CEJUG Discussão
2015-02-27 15:13 GMT+01:00 Paulo Jr. <paulo...@gmail.com>:
Desculpa galera, mas é um comparação pra lá de injusta né. Estão reclamando de uma coisa em uma linguagem que não foi feita e nem evoluida pra isso. Java não é dynamic typed, não é de linguagem de script e nem se propõe a ser a linguagem mais prática do mundo.

Lá vai em uma linguagem mais tipada do que Java. Scala: 

val lines = scala.io.Source.fromFile("file.txt").mkString

Realmente é muita covardia com Java. :D
  

Comparar linguagens com características completamente diferente chega a ser desleal. Posso botar uma linha de html5 que vira o navegador de cabeça pra baixo e dizer que Java não faz isso, ou mesmo de PHP que em 1 linha faz coisas que em java precisaria de umas 5 ou mais.

Sao diferentes mas com o mesmo propósito. Clojure foi criada para resolver os mesmos problemas que Java resolve. HTML5 tem um propósito totalmente diferente. Por isso, acho justo compará-las. O que acho desleal é Java consumir tanto do nosso tempo.
 

PS: Acho que o Hildeberto fez mais pra tirar uma onda, mas as comparações começaram e como disse, não vejo propósito nisso.

Uma forma bem humorada de ensinar uma outra linguagem ;-) É esse o propósito hihihihih
 

Jocelio Lima

unread,
Feb 27, 2015, 9:41:05 AM2/27/15
to ce...@googlegroups.com
Se falando de Scala e Clojure, posso usar essas linguagens "misturadas" com java em um mesmo projeto ?

--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att,
     Jocélio Lima

Paulo Jr.

unread,
Feb 27, 2015, 9:54:30 AM2/27/15
to CEJUG
Lá vai em uma linguagem mais tipada do que Java. Scala: 
val lines = scala.io.Source.fromFile("file.txt").mkString
Realmente é muita covardia com Java. :D
Desculpa, mas Scala não é mais fortemente tipada que Java : http://twitter.github.io/scala_school/advanced-types.html

Sao diferentes mas com o mesmo propósito. Clojure foi criada para resolver os mesmos problemas que Java resolve. HTML5 tem um propósito totalmente diferente. Por isso, acho justo compará-las. O que acho desleal é Java consumir tanto do nosso tempo.
São para o mesmo propósito? Eu não acho. Quando Ruby chegou falaram a mesma coisa.. com tempo viram que essa mega flexibilidade do Ruby detonou a linguagem e que ficou impossível de se manter um sistema que começasse a ficar grande. Hoje Ruby é só mais uma entre várias e Java continua a mais forte de todas. Consome tempo? Sim. Seria bom se fosse melhor? Claro, por favor, eu mesmo agradeceria muito. Mas mesmo não sendo eu ainda prefiro Java a essas outras por tudo que preciso e posso fazer com ela.

Uma forma bem humorada de ensinar uma outra linguagem ;-) É esse o propósito hihihihih
Bom, difícil aprender uma linguagem linha a linha.. pra mim foi mais pra detonar Java mostrando um recurso bacana de outra linguagem. Mas como já disse, continua não sendo uma comparação justa. E mesmo que encontre em Smalltalk uma forma melhor que em Java, Java ainda será a grande linguagem que é, mesmo sendo mais verbosa. Eu curto aprender linguagens novas, e ser entusiasta disso, mas você conhece a história do Java e não da pra querer que ele seja igual a essas outras linguagens do dia pra noite ou mesmo se um dia será igual a elas.

Se Java fosse como Ruby/Phyton/PHP/Clojure/.NET desde o início, teria a fama e a quantidade de usuários/empresas que tem hoje??

Hoje linguagens é como sorvete, tem sabor pra tudo e você escolhe o sabor da sua linguagem de acordo com seu paladar.


--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.

Hildeberto Mendonça

unread,
Feb 27, 2015, 9:57:48 AM2/27/15
to CEJUG Discussão
2015-02-27 15:41 GMT+01:00 Jocelio Lima <joce...@gmail.com>:
Se falando de Scala e Clojure, posso usar essas linguagens "misturadas" com java em um mesmo projeto ?

Pode sim, mas as outras linguagens nao reconhecem facilmente os contextos fantasmagóricos (que você sabe que existe por causa das anotacoes, mas nao faz idéia como funciona) gerenciados pelo container. Para integrar facilmente você poderia escrever só a lógica de negócio pura, o processamento dos dados, e revolver o resultado para JavaEE fazer o resto.

Hildeberto Mendonça

unread,
Feb 27, 2015, 10:48:05 AM2/27/15
to CEJUG Discussão
2015-02-27 15:54 GMT+01:00 Paulo Jr. <paulo...@gmail.com>:
Lá vai em uma linguagem mais tipada do que Java. Scala: 
val lines = scala.io.Source.fromFile("file.txt").mkString
Realmente é muita covardia com Java. :D
Desculpa, mas Scala não é mais fortemente tipada que Java : http://twitter.github.io/scala_school/advanced-types.html

Ambas sao fortemente tipadas, mas Scala é muito mais rica em termos de tipagem (http://stackoverflow.com/questions/3112725/advantages-of-scalas-type-system), portanto, Scala é "mais tipada do que Java", como disse anteriormente.
 

Sao diferentes mas com o mesmo propósito. Clojure foi criada para resolver os mesmos problemas que Java resolve. HTML5 tem um propósito totalmente diferente. Por isso, acho justo compará-las. O que acho desleal é Java consumir tanto do nosso tempo.
São para o mesmo propósito? Eu não acho. Quando Ruby chegou falaram a mesma coisa.. com tempo viram que essa mega flexibilidade do Ruby detonou a linguagem e que ficou impossível de se manter um sistema que começasse a ficar grande. Hoje Ruby é só mais uma entre várias e Java continua a mais forte de todas. Consome tempo? Sim. Seria bom se fosse melhor? Claro, por favor, eu mesmo agradeceria muito. Mas mesmo não sendo eu ainda prefiro Java a essas outras por tudo que preciso e posso fazer com ela.

Ruby é uma linguagem script de quarta geracao, interpretada. Em alguns casos, resolve os mesmos problemas que Java, mas nem sempre. Ou seja, os prósitos se coincidem só em alguns casos, nao em todos. Em Clojure é diferente. Ela roda na JVM da mesma forma que Java. A API Java é quase toda reutilizada. Depois da compilacao, Clojure tambem gera bytecode. Uma aplicacao Clojure também é distribuida em um jar e também é possível criar aplicacoes web distribuidas em war. Clojure é apenas um jar a mais no seu projeto ;-). Em resumo, assim como Java é mais poderosa do que Ruby, Clojure também é mais poderosa do que Ruby. Só que Clojure chega a ser ainda mais poderosa do que Java, gracas ao seu recurso de macros, que Scala está correndo atrás pra ter também e Java nem sonha em ter.
 

Uma forma bem humorada de ensinar uma outra linguagem ;-) É esse o propósito hihihihih
Bom, difícil aprender uma linguagem linha a linha.. pra mim foi mais pra detonar Java mostrando um recurso bacana de outra linguagem. Mas como já disse, continua não sendo uma comparação justa. E mesmo que encontre em Smalltalk uma forma melhor que em Java, Java ainda será a grande linguagem que é, mesmo sendo mais verbosa. Eu curto aprender linguagens novas, e ser entusiasta disso, mas você conhece a história do Java e não da pra querer que ele seja igual a essas outras linguagens do dia pra noite ou mesmo se um dia será igual a elas.

O fato de comparar uma linguagem com outra nao significa que existe uma intencao de mudar a outra linguagem (no caso Java). É apenas uma comparacao. Cada linguagem segue seu caminho, só que Java tem dois agravantes: nao esquece o passado e por isso está cheia de APIs perigosas, e evolui muito lentamente. Acho que só é menos verbosa do que C++, mas se comparada a sua eterna rival C#, está bem aquem do que poderia ser.
 

Se Java fosse como Ruby/Phyton/PHP/Clojure/.NET desde o início, teria a fama e a quantidade de usuários/empresas que tem hoje??

Acredito que teria muito mais usuários se resolvesse os agravantes acima. É por isso que outras linguagens estao ganhando forca. C, que nem é tao badalada, tem mais usuarios que Java. .Net só nao é mais usada por causa da historica limitacao de plataforma e por ser proprietaria, mas esses dois problemas a Microsoft já resolveu. Vamos ver como vai ficar nos próximos anos.

Recomendo esse video do Uncle Bob https://www.youtube.com/watch?v=SYeDxWKftfA&feature=youtu.be para entender que Clojure é realmente um sorvete Italiano.

Jocelio Lima

unread,
Feb 27, 2015, 11:16:23 AM2/27/15
to ce...@googlegroups.com
Na minha humilde opinião sobre java (que conheço um pouco) e Clojure (que não conheço nada) é que, parece ser bem mais fácil evoluir "A Roda" depois de alguém ter criado-a. 

--
Você recebeu essa mensagem porque está inscrito no grupo "CEJUG" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para cejug+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para ce...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/cejug.
Para mais opções, acesse https://groups.google.com/d/optout.



--
Att,
     Jocélio Lima

carlos timoshenko rodrigues lopes

unread,
Feb 27, 2015, 12:13:29 PM2/27/15
to ce...@googlegroups.com
rpz na boa, quase morro de rir depois dessa viu, parabéns. kkk

--

Hildeberto Mendonça

unread,
Feb 27, 2015, 2:58:27 PM2/27/15
to CEJUG Discussão
Oi Jocelio,

2015-02-27 17:16 GMT+01:00 Jocelio Lima <joce...@gmail.com>:
Na minha humilde opinião sobre java (que conheço um pouco) e Clojure (que não conheço nada) é que, parece ser bem mais fácil evoluir "A Roda" depois de alguém ter criado-a. 

Clojure é um dialeto de LISP. LISP é uma linguagem criada em 1957 por John McCarthy. McCarthy criou também o termo Inteligencia Artificial, a estrutura "ïf" e previu o surgimento do que hoje conhecemos como computação nas nuvens. LISP foi a segunda linguagem de programação, lançada logo depois de FORTRAN, e a primeira linguagem funcional. Em termos de sintax, a diferença entre LISP e Clojure é que todas as estruturas de dados em LISP são listas, representadas por parênteses e Clojure tem listas, vetores, maps e sets representados por parênteses, cochetes, chaves e #chaves respectivamente. Existem outros detalhes, mas são pequenos (como diz  Roberto Carlos) em relação a tudo que Clojure herdou de LISP.

Java foi lançada em 1995. Se tem uma linguagem que poderia ter aprendido com o passado seria Java, já que foi criada mais de 30 anos depois de LISP.Na verdade Java escolheu e vem trilhando o caminho mais dificil, que é manter e gerenciar a mutabilidade de seus objetos, que é considerado um dos problemas mais dificeis da computação: concorrência.



--

Breno Gomes

unread,
Feb 27, 2015, 3:16:49 PM2/27/15
to ce...@googlegroups.com

Paulo Henrique Alves

unread,
Feb 27, 2015, 3:43:02 PM2/27/15
to ce...@googlegroups.com
Clojure funciona sem a JVM?


---
Atenciosamente,
Paulo H3nrique Alves
It is not necessary to do extraordinary things to get extraordinary results. (W. Buffett)

Em 27 de fevereiro de 2015 16:58, Hildeberto Mendonça <m...@hildeberto.com> escreveu:

Hildeberto Mendonça

unread,
Feb 27, 2015, 3:51:57 PM2/27/15
to CEJUG Discussão
2015-02-27 21:42 GMT+01:00 Paulo Henrique Alves <paulohen...@gmail.com>:
Clojure funciona sem a JVM?

Clojure é uma linguagem hóspede, como Scala. Ou seja, ela precisa da JVM para funcionar. A vantagem de Clojure é que ela também funciona na CLR (máquina virtual .Net) e também compila para JavaScript (ClojureScript). Se a JVM se acabar amanhã, você não ficará na mão.

Clojure é apenas um jar a mais no classpath da aplicação.

Paulo Henrique Alves

unread,
Feb 27, 2015, 4:01:23 PM2/27/15
to ce...@googlegroups.com
Hildeberto,

Em 27 de fevereiro de 2015 17:51, Hildeberto Mendonça <m...@hildeberto.com> escreveu:
2015-02-27 21:42 GMT+01:00 Paulo Henrique Alves <paulohen...@gmail.com>:
Clojure funciona sem a JVM?

Clojure é uma linguagem hóspede, como Scala. Ou seja, ela precisa da JVM para funcionar. A vantagem de Clojure é que ela também funciona na CLR (máquina virtual .Net) e também compila para JavaScript (ClojureScript). Se a JVM se acabar amanhã, você não ficará na mão.

Isso esclareceu minha dúvida. Show!


Clojure é apenas um jar a mais no classpath da aplicação.

Mas isso me fez pensar, é mais uma lib em java em minha aplicação java. 

Hildeberto Mendonça

unread,
Feb 27, 2015, 4:20:12 PM2/27/15
to CEJUG Discussão
2015-02-27 22:00 GMT+01:00 Paulo Henrique Alves <paulohen...@gmail.com>:


Clojure é apenas um jar a mais no classpath da aplicação.

Mas isso me fez pensar, é mais uma lib em java em minha aplicação java.

É uma lib a mais que permite que a sua aplicação seja desenvolvida em parte ou totalmente em Clojure. Sua app vai continuar tendo muitas classes Java porque Clojure as utiliza quando são interessantes. Por exemplo: String em Clojure também é java.lang.String:

(.length "CEJUG") retorna 5
(.substring "CEJUG" 0 2) retorna "CE"
(.indexOf "CEJUG" "J") retorna 2

Em Java:

"CEJUG".length();
"CEJUG".substring(0, 2);
"CEJUG".indexOf("J");

Charles Queiroz

unread,
Feb 27, 2015, 4:28:19 PM2/27/15
to ce...@googlegroups.com
Eu concordo com o Paulo em vários aspectos, mas o principal deles é: Clojure é bem complicado de se ler. Até vc "entender" tem é Zé... 

Mas pq eu usaria ela? Qual é a vantagem mágica? Só eu consegui ser menos verboso? 

O que ela faz, q Java não faz, a não ser com menos linhas e mais difícil de se ler? 

Charles Queiroz


Dazen™  IT Services
Technology - Software Development 

cha...@dazen.com.br
Fortaleza - CE

Phone: +55 (85) 9786 8562

--

Rafael Uchôa

unread,
Feb 27, 2015, 4:59:59 PM2/27/15
to ce...@googlegroups.com
troll mode on:

cat arquivox.txt

troll mode off.

Concordo com o Paulo, não há o que comparar. Linguagens diferentes, épocas diferentes, focos diferentes.


Em 27 de fevereiro de 2015 17:51, Hildeberto Mendonça <m...@hildeberto.com> escreveu:

--

Hildeberto Mendonça

unread,
Feb 28, 2015, 1:29:34 PM2/28/15
to CEJUG Discussão
2015-02-27 22:28 GMT+01:00 Charles Queiroz <cha...@dazen.com.br>:
Eu concordo com o Paulo em vários aspectos, mas o principal deles é: Clojure é bem complicado de se ler. Até vc "entender" tem é Zé... 

Complicado como toda linguagem. Mas o que é realmente novo para quem programa em Java não é Clojure em si, é o aprendizado do paradgma funcional. Adaptar a mente do codigo imperativo e orientado a objetos para funcional é o que tem me levado mais tempo para aprender Clojure.

Só que não temos alternativa. Nós temos que aprender programação funcional, seja em Java (a partir do Java 8) ou em qualquer outra linguagem. É o único jeito de programar de forma segura para Cloud. Mais cedo ou mais tarde, todos nós vamos ter que fazer isso. Eu tenho certeza que se você aprender expressões lambda, streams e outros recursos funcionais do Java 8, você vai achar Clojure e Scala bem mais interessantes.

É dificil aceitar a mudança. É possível adiá-la, mas é impossível evitá-la.
 

Mas pq eu usaria ela? Qual é a vantagem mágica? Só eu consegui ser menos verboso? 

Para fazer tudo e muito mais do que você já faz hoje. A vantagem mágica, além de ser menos verbosa, compilar instantaneamente e mais produtiva, é não ter que lidar com concorrência. Tudo em Clojure é imutável, ou seja, suas threads nunca vão competir por um recurso exclusivo. Em Java, você sempre enfrenta dilemas do tipo, é melhor usar Vector ou ArrayList? Vector é mais lento porque é threadsafe, mas ArrayList pode ter efeitos colaterais, já que várias threads podem modificar seu estado. Em resumo, você não precisa colocar alguma coisa como Synchronized no seu código Clojure.

Além disso, Clojure herdou macros de LISP. O que isso quer dizer? Aqui eu cito o que disse o criador da linguagem:

"Quando você tem alguma coisa que adoraria sugerir aos projetistas de Java, o que você tem que fazer? Você tem que implorar por anos e esperar que outras pessoas implorem pela mesma coisa e então você terá o que deseja. Você não tem voz, você não tem nenhuma habilidade de adaptar a linguagem." - Rich Hickey

Macros permitem que você mude Clojure sem ter que pedir ao criador da linguagem para fazer isso. Macros permitem que você gere código Clojure em tempo de execução.

Outra mágica que podemos fazer em Clojure é injetar código na aplicação sem ter que reinicializá-la. Você pode corrigir erros sem interroper os serviços. Tudo compilado em tempo real em uma técnica conhecida como AOT (Ahead Of Time). Java é compilado via JIT (Just In Time).

Enfim, a sensação é de estar programando em uma linguagem do futuro, mesmo que seja baseada em uma das linguagens mais antigas.

Hildeberto Mendonça

unread,
Feb 28, 2015, 1:32:07 PM2/28/15
to CEJUG Discussão
2015-02-27 22:59 GMT+01:00 'Rafael Uchôa' via CEJUG <ce...@googlegroups.com>:

Concordo com o Paulo, não há o que comparar. Linguagens diferentes, épocas diferentes, focos diferentes.

Bom, eu já expliquei na thread que apesar de serem linguagens diferentes, as épocas não fazem diferença e o foco é exatamente o mesmo de Java ;-)

Rafael Uchôa

unread,
Feb 28, 2015, 3:31:55 PM2/28/15
to ce...@googlegroups.com
Calma povo, não estou dizendo nada de mal de nenhuma linguagem, só estou dizendo que são diferentes com focos diferentes, como podemos vê pela descrição e o intuito no tempo de criação de cada uma. Ah, e falando nisso, adoro C#. rs...

O que eu vejo hoje é uma grande luta para quem vai ser a "linguagem" de processamento paralelo da vez.

Se fosse resumir cada uma em uma palavra baseado nas descrições, eu diria:

Clojure: Dinamica.
Java: Portabilidade.

"Clojure is a dynamic programming language that targets the Java Virtual Machine (and the CLR, and JavaScript). It is designed to be a general-purpose language, combining the approachability and interactive development of a scripting language with an efficient and robust infrastructure for multithreaded programming."

ref: http://clojure.org/

"The Java® programming language is a general-purpose, concurrent, object-oriented language. Its syntax is similar to C and C++, but it omits many of the features that make C and C++ complex, confusing, and unsafe. The Java platform was initially developed to address the problems of building software for networked consumer devices. It was designed to support multiple host architectures and to allow secure delivery of software components. To meet these requirements, compiled code had to survive transport across networks, operate on any client, and assure the client that it was safe to run. "

ref: http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-1.html#jvms-1.1





--

Hildeberto Mendonça

unread,
Feb 28, 2015, 4:23:38 PM2/28/15
to CEJUG Discussão
Sem stress cara. Está até me ajudando a escrever sobre o assunto, respondendo dúvidas mais comuns.

2015-02-28 21:31 GMT+01:00 'Rafael Uchôa' via CEJUG <ce...@googlegroups.com>:
Calma povo, não estou dizendo nada de mal de nenhuma linguagem, só estou dizendo que são diferentes com focos diferentes, como podemos vê pela descrição e o intuito no tempo de criação de cada uma. Ah, e falando nisso, adoro C#. rs...

São diferentes porque uma é funcional e a outra é imperativa mas ambas tem exatamente o mesmo foco, os mesmos problemas a resolver. Portanto, Java e Clojure competem entre si. Quero apenas deixar claro que Clojure não é como PHP ou Ruby, como se acredita.
 

O que eu vejo hoje é uma grande luta para quem vai ser a "linguagem" de processamento paralelo da vez.

Processamento paralelo é diferente de concorrência. Processamento paralelo é quando você consegue dividir um problema em duas ou mais partes e dedicar uma thread para resolver cada parte separadamente. Ex. Processamento em batch, criação de threads para tratar conexões dos usuários em um container web. Concorrência é quando várias threads tentam acessar recursos de um problema que não foi previamente dividido. Ex.: Criar um atributo em um EJB stateless gera um problema de concorrência, pois várias threads podem acessá-la simultaneamente, gerando efeitos colaterais sérios.
 

Se fosse resumir cada uma em uma palavra baseado nas descrições, eu diria:

Clojure: Dinamica.
Java: Portabilidade.

Clojure também precisa da JVM para executar, por isso ela é tão portável quanto Java. Só que é ainda mais portável que Java porque Clojure também executa na CLR (.Net) e também compila para JavaScript. A sintax de Clojure é tão simples de interpretar que é muito fácil para uma plataforma suportar Clojure.

Dinâmica quer dizer que seus tipos são definidos dinamicamente, dependendo dos valores manipulados. Mas é tão prático extender Clojure que já criaram até uma biblioteca que permite tipar Clojure (https://github.com/clojure/core.typed).
 
"Clojure is a dynamic programming language that targets the Java Virtual Machine (and the CLR, and JavaScript). It is designed to be a general-purpose language, combining the approachability and interactive development of a scripting language with an efficient and robust infrastructure for multithreaded programming."

Destaco "general-purpose language" para acabar com o mito que Clojure tem um foco diferente de Java. Atenção: ele menciona "scripting language", mas não está dizendo que Clojure é uma linguagem script. O que ele quer dizer é que com Clojure você tem a mesma sensação de trabalhar com uma linguagem script, mas num ambiente eficiente e robusto, que é a JVM e a CLR.
 

"The Java® programming language is a general-purpose, concurrent, object-oriented language. Its syntax is similar to C and C++, but it omits many of the features that make C and C++ complex, confusing, and unsafe. The Java platform was initially developed to address the problems of building software for networked consumer devices. It was designed to support multiple host architectures and to allow secure delivery of software components. To meet these requirements, compiled code had to survive transport across networks, operate on any client, and assure the client that it was safe to run. "

Java is "safe" in termos de tipagem e gerenciamento de memória (garbage collector), mas totalmente "unsafe" no que se refere a concorrência. O esforço de destruir objetos em C++ equivale ao esforço de proteger o estado dos objetos, que são em sua grande maioria mutáveis. Clojure executa em todo lugar que Java executa, então, mais da metade da descrição acima também se aplica a Clojure.

Curiosidade: Brian Goetz, autor do livro "Java: Concurrency in Practice" e responsável pelo suporte a programação funcional em Java 8, palestrou em uma conferência de Clojure e disse que o seu livro foi a grande inspiração de Rich Hickey para criar Clojure pois Rich queria se livrar de uma vez por todas desse tipo de complexidade: https://www.youtube.com/watch?v=2y5Pv4yN0b0

Rafael Uchôa

unread,
Mar 1, 2015, 1:13:08 AM3/1/15
to ce...@googlegroups.com
Então, eu vejo o java "hoje" como a plataforma onde outras linguagens como Clojure, podem viver. rs... (Isso, é claro, até ela ter o seu próprio compilador, igual a Go language, que já nasceu compilando...)

Quando ao processamento paralelo, eu tava falando de paralelo mesmo, porque concorrente a gente já tem várias:

Erlang, Scala com o actor model,
Haskell, Clojure com STM,
e o Akka/Scala com o dataflow concurrency.

Clojure é muito legal, fui brincar com o brinquedo novo também depois do seu post, rs..., mas já vi muito do que ela tem, em Erlang e Go, por mais que eu ache que o actor model de Erlang e os channels de Go bem mais robustos, mas se falando somente em linguagem, clojure é interessante, mas não é uma grande evolução para quem já viu isso em outras linguagens. Mas é uma ótima opção de linguagem sobre a JVM, o futuro é bom.

E quanto ao vídeo Brian, pergunta pra ele, porque não deu certo trazer a LambdaExpression tipada, igualzinha a do C#. Acredito que isso seja uma questão do compilador e não de compatibilidade. Isso poderia ser a causa do surgimento de tantas linguagens de script sobre a JVM. Será que no Java 10 ?!


--

Hildeberto Mendonça

unread,
Mar 1, 2015, 5:36:28 AM3/1/15
to CEJUG Discussão
2015-03-01 7:12 GMT+01:00 'Rafael Uchôa' via CEJUG <ce...@googlegroups.com>:
Então, eu vejo o java "hoje" como a plataforma onde outras linguagens como Clojure, podem viver. rs... (Isso, é claro, até ela ter o seu próprio compilador, igual a Go language, que já nasceu compilando...)

Hoje faz pouco sentido para uma linguagem criar seu próprio compilador. Poucas linguagens tem esse privilégio. As que decidem fazer essa loucura, estão ignorando uma quantidade gigantesca de bibliotecas disponíveis e as otimizações feitas ao longo de anos.

Go tem seu próprio compilador, mas é um produto Google. Eles não cairiam novamente no erro de usar a JVM, como foi o caso do Android. O banco de dados CouchDB começou escrito em Erlang, mas tiveram que migrar para C/C++ por causa dos problemas de performance. Haskell tem tão poucas bibliotecas disponíveis então o ambiente acaba ficando heterogêneo.
 

Quando ao processamento paralelo, eu tava falando de paralelo mesmo, porque concorrente a gente já tem várias:

Oxe, mas pra fazer processamento paralelo não tem segredo. Se não tem concorrência, as thread vão executar em lua de mel com os dados.
 

Clojure é muito legal, fui brincar com o brinquedo novo também depois do seu post, rs..., mas já vi muito do que ela tem, em Erlang e Go, por mais que eu ache que o actor model de Erlang e os channels de Go bem mais robustos, mas se falando somente em linguagem, clojure é interessante, mas não é uma grande evolução para quem já viu isso em outras linguagens. Mas é uma ótima opção de linguagem sobre a JVM, o futuro é bom.

Clojure não precisa ser uma "evolução"ou "revolução". Clojure é simplesmente mais simples e mais útil do que Go (maior aplicabilidade) e mais rápida do que Erlang, por simplesmente usar a JVM/CLR ;-)
Reply all
Reply to author
Forward
0 new messages