:javadoc: https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/function/package-summary.html :source-highlighter: highlightjs :numbered: :icons: font :jdk_version: 17+
ifdef::env-github[] :outfilesuffix: .adoc :caution-caption: :fire: :important-caption: :exclamation: :note-caption: :paperclip: :tip-caption: :bulb: :warning-caption: :warning: endif::[]
= Programação Funcional, Expressões Lambda e Streams em Java {jdk_version} image:https://img.shields.io/github/actions/workflow/status/manoelcampos/programacao-funcional-java/build.yml?branch=master[GitHub Workflow Status]
Programação funcional é um paradigma que tem suas origens em fundamentos matemáticos da década de 1930. Mas tal paradigma se popularizou possivelmente apenas na última década. Ele permite criar software de forma mais clara, com menos código e menor complexidade por meio de reaproveitamento e composição de funções. Tal paradigma além de facilitar e agilizar a escrita de código, tende a gerar software com menos bugs e mais fácil de manter.
Programação orientada a objetos é o paradigma mais utilizado para desenvolvimento de software. Mas assim como programação estruturada também é utilizada em conjunto com tal paradigma, programação funcional é um recurso a mais que pode utilizar em softwares que seguem programação estruturae e/ou orientada a objetos.
Se você não conhece programação funcional ainda, você está sofrendo mais do que deveria para desenvolver software.
Este repositório fornece um projeto para permitir praticar programação funcional no Java {jdk_version} e entender o funcionamento de novos recursos da linguagem, como Streams e Expressões Lambda.
- https://www.youtube.com/watch?v=wbcRS7N4uqA&list=PLyo0RUAM69UtVR8knBrUgjQbQQECatElL[Curso Programação Funcional em Java (e JS) no YouTube]
- https://docs.google.com/presentation/d/1toGU4i7mxv4WNSrfWsf7lgrqUSn4wAKlp2c0rAeczNY[Slides Programação Funcional em Java]. ====
O recurso de Streams introduzido no Java 8 (não confundir com InputStream e OutputStream) permite processamento de dados de forma sequencial e paralelo. Neste último caso, processamento paralelo (utilizando múltiplas CPUs de uma mesma máquina) tem tudo a ver com sistemas distribuídos. Desta forma, tais recursos são de fundamental importância para complementar a formação do estudante em programação.
== Repositórios com exercícios das aulas
- https://github.com/manoelcampos/fp-aula-01-soma-dobro-pares-js[Aula 01: Soma do dobro dos números pares em JS]
- https://github.com/manoelcampos/fp-aula-02-imutabilidade-java[Aula 02: Imutabilidade em Java]
- https://github.com/manoelcampos/fp-aula-04-lambda-stream-projeto-base-java[Aula 04: Lambda e Streams em Java]
== Material de Apoio
- https://www.oracle.com/br/technical-resources/articles/java-stream-api.html[Curso Streams e Expressões Lambda do Java 8]
- http://bit.ly/2I2U5bU[Curso JDK 8 MOOC: Lambdas and Streams Introduction]
- https://www.oracle.com/technical-resources/articles/java/ma14-java-se-8-streams.html[Processing Data with Java SE 8 Streams, Part 1]
O primeiro link é um tutorial em português. O segundo é um curso completo em vídeo, mas em inglês. Acessando o segundo link você pode ter acesso aos slides do curso. Concluindo o curso você ganha um certificado de participação da Oracle.
Como as inscrições não estão abertas a todo momento, você pode não conseguir acessar o material. Mas os vídeos estão disponíveis no https://youtube.com/playlist?list=PLMod1hYiIvSZL1xclvHcsV2dMiminf19x[YouTube]. Apesar de serem em inglês, os vídeos contam com legendas oficiais (que podem ser traduzidas para o português).
== Interfaces Funcionais
Ao iniciar em programação funcional no Java 8+, é preciso aprender um novo vocabulário.
image:interfaces-funcionais.png[link={javadoc}]
Conhecendo os termos deste vocabulário, quando você vir um método que solicita como parâmetro um objeto:
-
Predicate
, saberá que pode passar uma expressão lambda que representa uma função que recebe um objeto (comoStudent
) e retorna um valorboolean
, representando uma condição em relação a tal objeto. -
Consumer
, saberá que pode passar uma expressão lambda que representa uma função que recebe um objeto (comoStudent
), faz qualquer coisa com ele (consome) e não retorna nada (void
).
Assim, para entender este novo vocabulário, você poderá ver o JavaDoc do pacote java.util.function
no seu IDE, ou acessar link:{javadoc}[aqui].
Entender este vocabulário faz toda a diferença na sua fluência em programação funcional.
== Novidades da Linguagem Java
O JDK há bastante tempo passou a ter um ciclo de releases que ocorre a cada 6 meses, incluindo muitas melhorias e recursos incríveis. Se você quer ficar por dentro das novidades em cada nova versão do JDK, veja https://github.com/manoelcampos/jdk-new-features[este repositório] (apenas em inglês).