JavaRush /Blogue Java /Random-PT /Pare de escrever ciclos! Os 10 melhores métodos para trab...

Pare de escrever ciclos! Os 10 melhores métodos para trabalhar com coleções do Java 8

Publicado no grupo Random-PT
Acho que não há necessidade de explicar aos alunos do JavaRush o que são coleções e para que servem. No entanto, após o lançamento da 8ª versão, muitas operações elementares, que antes ocupavam de 6 a 7 linhas de código, foram simplificadas ao mínimo. Sem mais delongas, aqui estão as 10 melhores técnicas do Java8 Collections Framework que economizarão muito tempo e espaço! Pare de escrever ciclos!  Os 10 melhores métodos para trabalhar com coleções do Java 8-1Olá a todos, amigos! O hábito, como você sabe, é uma segunda natureza. E depois de me acostumar a escrever, for (int i = 0; i <......)não quero reaprender de jeito nenhum (até porque esse design é bastante simples e direto). No entanto, dentro dos loops, muitas vezes repetimos as mesmas operações elementares, das quais gostaríamos muito de nos livrar da repetição. Com o lançamento do Java8, a Oracle decidiu nos ajudar nisso. Abaixo estão os 10 melhores métodos de coleta que economizarão muito tempo e código.

1. Iterable.forEach (ação do consumidor <? super T>)

O nome fala por si. Itera pela coleção passada e executa uma expressão lambda actionpara cada elemento.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7

2. Collection.removeIf (filtro Predicado <? super E>)

Nada complicado também. O método itera pela coleção e remove os elementos que correspondem a filter.
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
 numbers.forEach(s -> System.out.print(s + " "));
Em uma linha removemos da lista todos os números maiores que 5.

3. Map.forEach(BiConsumer<? super K, ? super V> ação)

O método forEachfunciona não apenas para classes que implementam a interface Collection, mas também para classes Map.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

4. Map.compute (tecla K, BiFunction <? super K, ? super V, ? extends V> remappingFunction)

Parece um pouco mais intimidante, mas na realidade é simples, como todos os anteriores. Para a chave especificada key, este método define o valor como o resultado da função remappingFunction. Por exemplo:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));

books.compute("Философия Java", (a,b) -> b+", крутой чувак");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_______________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель, крутой чувак
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
O autor de " Java Philosophy " é definitivamente legal! :)

5. Map.computeIfAbsent (tecla K, Função <? super K,? estende V> mapeamentoFunction)

O método adicionará um novo elemento ao Map , mas somente se o elemento com a mesma chave não estiver lá. O resultado valueda execução da função será atribuído a ela mappingFunction. Se já existir um elemento com essa chave, ele não será substituído, mas permanecerá no lugar. Vamos voltar aos nossos livros e tentar um novo método:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfAbsent("Гарри Поттер и узник Азкабана", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Nossa função mappingFunction:
public static String getHarryPotterAuthor() {
        return "Джоан Роулинг";
    }
E aqui está o novo livro:
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Гарри Поттер и узник Азкабана. Author: Джоан Роулинг
Название книги: Властелин Колец. Author: Джон Толкин

6. Map.computeIfPresent(tecla K, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

O mesmo princípio de , Map.compute()mas todos os cálculos só serão realizados se o elemento com a chave keyjá existir.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.computeIfPresent("Евгений Онегин", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
books.computeIfPresent("Братья Карамазовы", (a,b) -> b="Александр Пушкин");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Название книги: " + a + ". Author: " + b));
Quando a função foi chamada pela primeira vez, nenhuma alteração ocorreu, pois Mapnão existe nenhum livro com o título “Eugene Onegin” no nosso. Mas pela segunda vez o programa mudou o autor do livro “Os Irmãos Karamazov” para “Alexander Pushkin”. Conclusão:
_________________
Название книги: Братья Карамазовы. Author: Федор Достоевский
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин
_________________
Название книги: Братья Карамазовы. Author: Александр Пушкин
Название книги: Философия Java. Author: Брюс Эккель
Название книги: Преступление и наказание. Author: Федор Достоевский
Название книги: Война и мир. Author: Лев Толстой
Название книги: Властелин Колец. Author: Джон Толкин

7. Map.getOrDefault (chave do objeto, V defaultValue)

Retorna o valor correspondente à chave key. Se tal chave não existir, retorna o valor padrão.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

String igor = books.getOrDefault("Слово о полку Игореве", "Неизвестный автор");
System.out.println(igor);
Muito confortavelmente:
Неизвестный автор

8. Map.merge (chave K, valor V, BiFunction <? super V, ? super V, ? estende V> remappingFunction)

Nem tentei calcular quantas linhas de código esse método economizará para você.
  • MapSe a chave keynão existir na sua , ou valuepara esta chave for igual , nullo método adiciona .Mapkey-value
  • Se a chave Keyexistir e estiver lá, value != nullo método a altera valuepara o resultado da execução da função passada remappingFunction.
  • Se remappingFunctionretornar null, keyserá removido da coleção.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.merge("Философия Java", "Брюс Эккель", (a, b) -> b +  " и кто-то там еще");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Conclusão:
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель и кто-то там еще
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
*desculpa, Bruce*

9. Map.putIfAbsent (chave K, valor V)

Anteriormente, para adicionar um par Mapcaso ele não estivesse lá, era necessário fazer o seguinte:
Map <String, String> map = new HashMap<>();
if (map.get("Властелин Колец") == null)
    map.put("Властелин Колец", "Джон Толкин");
Agora tudo ficou muito mais simples:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Властелин Колец", "Джон Толкин");

10. Map.replace e Map.replaceAll()

Último da lista, mas não menos importante. Map.replace(K key, V newValue— substitui o valor da chave keypor newValue, se tal chave existir. Caso contrário, nada acontece. Map.replace(K key, V oldValue, V newValue)- faz a mesma coisa, mas apenas se o valor atual keyfor oldValue. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)— substitui todos os valores valuepelo resultado da execução da função function. Por exemplo:
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replace("Братья Карамазовы", "Брюс Эккель", "Джон Толкин");
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
Название:Братья Карамазовы. Author: Федор Достоевский
Название:Философия Java. Author: Брюс Эккель
Название:Преступление и наказание. Author: Федор Достоевский
Название:Война и мир. Author: Лев Толстой
Название:Властелин Колец. Author: Джон Толкин
Não funcionou! O valor atual da chave dos Irmãos Karamazov é Fyodor Dostoevsky, não Bruce Eckel, então nada mudou.
Map <String, String> books = new HashMap<>();
books.put("Война и мир", "Лев Толстой");
books.put("Преступление и наказание", "Федор Достоевский");
books.put("Философия Java", "Брюс Эккель");
books.put("Братья Карамазовы", "Федор Достоевский");
books.put("Властелин Колец", "Джон Толкин");

books.replaceAll((a,b) -> getCoolWriter());
books.forEach((a,b) -> System.out.println("Название:" + a + ". Author: " + b));
public static String getCoolWriter() {
        return "Крутой писатель";
    }
Название:Братья Карамазовы. Author: Крутой писатель
Название:Философия Java. Author: Крутой писатель
Название:Преступление и наказание. Author: Крутой писатель
Название:Война и мир. Author: Крутой писатель
Название:Властелин Колец. Author: Крутой писатель
Alterou facilmente os valores de todo o mapa sem quaisquer construções complexas! PS Acostumar-se com algo novo é sempre difícil, mas essas mudanças são muito boas. De qualquer forma, algumas partes do meu código agora estão definitivamente menos parecidas com espaguete do que antes :) Se você gostou do artigo e gostaria de ver novos, não se esqueça de apoiar o autor na competição clicando em “Curtir”, ou melhor ainda, “Curtir” :) Boa sorte nos estudos!
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION