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! Olá 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 lambdaaction
para 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 afilter
.
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étodoforEach
funciona 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 especificadakey
, 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 resultadovalue
da 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 key
já 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 Map
nã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 à chavekey
. 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ê.Map
Se a chavekey
não existir na sua , ouvalue
para esta chave for igual ,null
o método adiciona .Map
key-value
- Se a chave
Key
existir e estiver lá,value != null
o método a alteravalue
para o resultado da execução da função passadaremappingFunction
. - Se
remappingFunction
retornarnull
,key
será 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 parMap
caso 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 key
por 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 key
for oldValue
. Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
— substitui todos os valores value
pelo 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!
GO TO FULL VERSION