Ordenação de listas com Java 8 e Lambdas Expression

Postado em por Wolmir Cezer Garbin em Java | 126 Visualizações
Última atualização em:

Neste exemplo, será mostrado como o Java 8 pode auxiliar no desenvolvimento de aplicações mostrando um exemplo de ordenação do Java 6 ao Java 8 com a utilização de lambdas.

Ordenação de listas com Java 8 e Lambdas Expression

Lambda Expressions é um novo recurso da linguagem java introduzido na versão 8 do Java. Eles permitem que você trate a funcionalidade como um argumento de método ou código como dados.

As expressões lambdas podem expressar instâncias de interfaces em um único método (interfaces funcionais) de forma mais compacta. É uma evolução da linguagem Java o que a torna mais flexível e deixa a implementação de código mais enxuta e simples.

Neste exemplo, ordenaremos uma lista de nomes do modo tradicional usando o Java 8, veja o código:

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class OrdenacaoLista {

    public static void main(String args[]) {
        List<String> ls = Arrays.asList("João", "José", "Maria", "Adam");

        Comparator<String> comparator = new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        };

        Collections.sort(ls, comparator);

        for( String nome : ls ) {
            System.out.println( nome );
        }
    }
}

Esta classe ao ser executada mostra o seguinte resultado:

Adam
José
João
Maria

Mas podemos melhorar a o código e deixar bem mais simples e limpo com a utilização de java 8, então vamos fazer passo a passo.

Primeiro, podemos substituir o Collections pelo próprio objeto da lista, já que agora ela possui o método sort, veja:

	[...]
	public static void main(String args[]) {
        List<String> ls = Arrays.asList("João", "José", "Maria", "Adam");

        [...]

        ls.sort(comparator);

        [...]
    }
		[...]

A interface Comparator é uma interface funcional, sabemos disso verificando seu código:

@FunctionalInterface
public interface Comparator<T> {
  [...]
}

Note que ela possui a anotação @FunctionalInterface isso significa que podemos utilizar Lambdas para implementar seu método e tudo vai funcionar.

Então podemos deixar o código da seguinte forma:

   [...]
   public static void main(String args[]) {
        List<String> ls = Arrays.asList("João", "José", "Maria", "Adam");

        Comparator<String> comparator = (o1, o2) -> {
            return o1.compareTo(o2);
        };

        ls.sort(comparator);

        [...]
    }
		[...]

Este código ainda pode ser melhor, como temos apenas uma linha na implementação do comparator, podemos deixar da seguinte forma:

   [...]
   public static void main(String args[]) {
        List<String> ls = Arrays.asList("João", "José", "Maria", "Adam");

        Comparator<String> comparator = (o1, o2) -> o1.compareTo(o2);

        ls.sort(comparator);

        for( String nome : ls ) {
            System.out.println( nome );
        }
    }
		[...]

Para simplificar ainda mais, podemos adicionar a implementação diretamente no .sort da lista, veja:

   [...]
   public static void main(String args[]) {
        List<String> ls = Arrays.asList("João", "José", "Maria", "Adam");

        ls.sort((o1, o2) -> o1.compareTo(o2));

        for( String nome : ls ) {
            System.out.println( nome );
        }
    }
		[...]

Para finalizar, é possível melhorar o for each que faz a impressão dos nomes, veja:

   [...]
   public static void main(String args[]) {
        List<String> ls = Arrays.asList("João", "José", "Maria", "Adam");

        ls.sort((o1, o2) -> o1.compareTo(o2));

        ls.forEach(System.out::println);
    }
   [...]

O que acha do nosso código agora?

Mas ainda podemos melhorar mais um pouco, que tal usarmos referências de métodos também no sort? Então:

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class OrdenacaoLista {
   public static void main(String args[]) {
        List<String> ls = Arrays.asList("João", "José", "Maria", "Adam");
        ls.sort(String::compareTo);
        ls.forEach(System.out::println);
    }
}

Simplificou bastante graças ao Lambdas do Java 8. Qualquer dúvida ou sugestão deixe nos comentários.

Wolmir Cezer Garbin

Wolmir Cezer Garbin


Sou formado em Desenvolvimento de Sistemas para Internet pela faculdade Mater Dei e Pós graduado em Desenvolvimento de sistemas em Java pela UTFPR. Trabalho a mais de 9 anos com desenvolvimento em Java, Android e Web utilizando as principais tecnologias do mercado. Atuo como professor na faculdade Mater Dei, programador na Garbo Software e criador do Receitas de Código.

Ver mais

Posts relacionados


Code Conference

Esta é uma conferência de código realizada na cidade de Pato Branco para dissiminar tendências e informações sobre programação e novas tecnológias

Veja mais sobre o Code Conference

Publique seu post no Receitas de Código

Agora você pode publicar seu post no Receitas de Código e compartilhar seu conhecimento com muitas pessoas!

Quero publicar