JavaRush /Blogue Java /Random-PT /Lambdas e streams, apenas prática, sem teoria

Lambdas e streams, apenas prática, sem teoria

Publicado no grupo Random-PT
Olá a todos. Por ocasião do concurso, resolvi escrever aqui não um artigo, mas uma pequena lição. Será sobre lambdas e streams em Java. Se você já os conhece e os utiliza, vá direto para o final do artigo, haverá uma pequena seleção de tarefas com JavaRush nas quais você pode praticar. Você precisa de java 8 e superior, treinamento de JR, serão poucos detalhes e muitas coisas incompreensíveis, uma forte vontade de descobrir. Vamos começar com o fato de que não vou explicar a história do aparecimento de lambdas e streams, só não sei. Só sei que eles vieram do estilo de programação funcional para o nosso estilo OOP. Na minha curta experiência de aprendizado, simplesmente mostrei como e o quê, algumas pessoas têm dificuldade em entender a ideia, então lembre-se apenas de como escrever, você entenderá mais tarde.

Lambdas

Lambdas e streams, apenas prática, sem teoria - 1Lambdas e streams, apenas prática, sem teoria - 2Se você não sabe o que são lambdas, então: Um lambda se parece com isto:
(a, b) -> a.compareTo(b)
(переменные) -> действие
Isso é o suficiente por enquanto. Você pode ler a teoria aqui: link um , link dois , mas acho que a prática é muito mais divertida. Sugiro que você resolva o seguinte problema: Escreva uma calculadora usando o método 1. O método deve aceitar 2 valores digitais e mais alguma coisa. Seu código será parecido com isto:
class Lambda{
    public static void main (String[] args) {
	}

    public static double calculate(){
       	return null;
    }
}
Você precisa inserir 3 parâmetros na assinatura do método calculate, adicionar 1 comando returne testar a chamada desse método main. O que esse método deve ser capaz de fazer?
  • dobrar;
  • multiplicar;
  • dividir;
  • subtrair;
  • calcule a raiz;
  • elevar a um poder;
  • elevar à potência a soma dos argumentos dividida pelo primeiro número + 117;
  • e todas as outras operações que você possa imaginar.
O que não usar:
  • if-else;
  • charcomo indicador de operação;
  • switch-case;
  • e tudo mais que vier à sua mente.
O que você pode usar:
  • Apenas lambdas, a tarefa é deles.
- O que? E é tudo? - Sim, é tudo, porque você precisa literalmente adicionar 3 linhas, se eu sugerir pelo menos uma, o resto será escrito automaticamente. E se quiser, pode pesquisar exemplos no Google e tentar entender. Claro, você mesmo se verificará e se trapacear ninguém saberá, mas então por quê? Tendo resolvido um problema tão simples, todos os meus alunos do 1.5 ganharam uma compreensão aproximada do que são lambdas e como usá-los. Isso será muito necessário para streaming. Se quiser se gabar do resultado e saber se acertou, envie o código em mensagem privada. Não há necessidade de comentar, você pode adicionar dicas interessantes (mas de forma a não facilitar muito a tarefa). Novamente, tendo resolvido este exemplo, você já deve ter uma compreensão aproximada de como usar lambdas.
Lambdas e streams, apenas prática, sem teoria - 3
Agora vamos passar para os fluxos Java. Esses não são os fluxos que você, leitor, pode ter pensado. Não, não é inputStreame não é OutputStream. É diferente, é mais interessante. Os fluxos substituíram os ciclos, não completamente, mas ainda assim. Eles recebem o lema “não explique como fazer, explique o que fazer”. Um pequeno exemplo de fluxo:
List<String> myList = Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList.stream()
    .filter(s -> s.startsWith("c"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);
O que está acontecendo aqui? Vamos adicionar comentários:
myList.stream() // получить поток
    .filter(s -> s.startsWith("c")) //отфильтровать значения, оставить те, что начинаются с «с»
    .map(String::toUpperCase)  // преобразовать все значения, перевести в верхний регистр
    .sorted() // отсортировать по порядку (дефолтный порядо)
    .forEach(System.out::println); // вывести каждый элемент на экран
Compare com um loop normal:
List<String> toSort = new ArrayList<>();
for(String s : myList){
     if(s.startsWith("c")){
         toSort.add(s.toUpperCase());
     }
}

Collections.sort(toSort);

for(String s : toSort){
     System.ouy.println(s);
}
Quando você lê o código, tudo parece assustador, mas é mais fácil com comentários? Isso é normal, eu também não os entendia há muito tempo. A chave para a compreensão é a prática. Portanto, começamos a ler artigos de terceiros e a buscar respostas para nossas dúvidas, você também pode perguntar aqui nos comentários, não vou dar uma resposta completa, mas vou apontar a direção. Lista de tarefas do JavaRush que considero ótimas para praticar streaming:
  • 2208 - pode ser resolvido com 1 fluxo e 1 retorno, ou seja o corpo do método começará returne então haverá 1 fluxo inteiro. Vamos omitir o requisito StringBuilder.

  • 1908 - você também pode resolver com 1 fluxo e 1 retorno. Começando pela leitura do arquivo. Não sei como gravar em um arquivo via streams (se isso for possível), por enquanto fazemos isso manualmente. Aqueles. Abrimos apenas 2 fluxos (console e gravação em arquivo). Lemos o arquivo através de métodos que nos retornarão uma planilha ou um stream (google e javadoc).

  • 1907 - em teoria, também pode ser resolvido em um fluxo. A entrada para o fluxo é o nome do arquivo, a saída é o número de palavras mundo.

Isso é tudo. Se eu puder, escreverei outra história simples. Na minha opinião, ler sobre algo legal sem a oportunidade de experimentar é um tanto chato ou algo assim. E depois da calculadora e dos 3 quebra-cabeças, acho que você já está se dando bem com lambdas e streams, então leia sobre todas as possibilidades, caso ainda não o tenha feito. Atualização:
  • 1016 - de forma um pouco pervertida, você pode resolver em 1 fluxo e 1 retorno;

  • 1821 - muito fácil e em 1 fluxo e 1 retorno.

    Essas 2 tarefas apresentarão outro método de streaming e outro coletor.

  • 1925 - você pode obter uma linha com palavras em um fluxo e depois gravá-la em um arquivo (não sei se é possível gravar em um arquivo a partir de um fluxo)

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION