Lambdas
Se 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 return
e 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.
if-else
;char
como indicador de operação;switch-case
;- e tudo mais que vier à sua mente.
- Apenas lambdas, a tarefa é deles.
inputStream
e 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á
return
e então haverá 1 fluxo inteiro. Vamos omitir o requisitoStringBuilder
. -
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.
-
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)
GO TO FULL VERSION