Java 8 Lambda: exemple de comparaison

Java 8 Lambda: exemple de comparaison

java-lambda-expression

Dans cet exemple, nous allons vous montrer comment utiliser l'expression Lambda Java 8 pour écrire unComparator pour trier une liste.

1. Exemple classique deComparator.

    Comparator byName = new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getName().compareTo(o2.getName());
        }
    };

2. Expression d'expression lambda.

    Comparator byName =
        (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());

1. Trier sans Lambda

Exemple pour comparer les objetsDeveloper en utilisant leur âge. Normalement, vous utilisezCollections.sort et passez une classeComparator anonyme comme ceci:

TestSorting.java

package com.example.java8;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class TestSorting {

    public static void main(String[] args) {

        List listDevs = getDevelopers();

        System.out.println("Before Sort");
        for (Developer developer : listDevs) {
            System.out.println(developer);
        }

        //sort by age
        Collections.sort(listDevs, new Comparator() {
            @Override
            public int compare(Developer o1, Developer o2) {
                return o1.getAge() - o2.getAge();
            }
        });

        System.out.println("After Sort");
        for (Developer developer : listDevs) {
            System.out.println(developer);
        }

    }

    private static List getDevelopers() {

        List result = new ArrayList();

        result.add(new Developer("example", new BigDecimal("70000"), 33));
        result.add(new Developer("alvin", new BigDecimal("80000"), 20));
        result.add(new Developer("jason", new BigDecimal("100000"), 10));
        result.add(new Developer("iris", new BigDecimal("170000"), 55));

        return result;

    }

}

Sortie

Before Sort
Developer [name=example, salary=70000, age=33]
Developer [name=alvin, salary=80000, age=20]
Developer [name=jason, salary=100000, age=10]
Developer [name=iris, salary=170000, age=55]

After Sort
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=example, salary=70000, age=33]
Developer [name=iris, salary=170000, age=55]

Lorsque l'exigence de tri est modifiée, il vous suffit de passer une autre nouvelle classeComparator anonyme:

    //sort by age
    Collections.sort(listDevs, new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getAge() - o2.getAge();
        }
    });

    //sort by name
    Collections.sort(listDevs, new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });

    //sort by salary
    Collections.sort(listDevs, new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getSalary().compareTo(o2.getSalary());
        }
    });

Cela fonctionne, mais pensez-vous que c'est un peu bizarre de créer une classe juste parce que vous voulez changer une seule ligne de code?

2. Trier avec Lambda

Dans Java 8, l'interfaceList prend directement en charge la méthodesort, plus besoin d'utiliserCollections.sort.

        //List.sort() since Java 8
    listDevs.sort(new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o2.getAge() - o1.getAge();
        }
    });

Exemple d'expression lambda:

TestSorting.java

package com.example.java8;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

public class TestSorting {

    public static void main(String[] args) {

        List listDevs = getDevelopers();

        System.out.println("Before Sort");
        for (Developer developer : listDevs) {
            System.out.println(developer);
        }

        System.out.println("After Sort");

        //lambda here!
        listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());

        //java 8 only, lambda also, to print the List
        listDevs.forEach((developer)->System.out.println(developer));
    }

    private static List getDevelopers() {

        List result = new ArrayList();

        result.add(new Developer("example", new BigDecimal("70000"), 33));
        result.add(new Developer("alvin", new BigDecimal("80000"), 20));
        result.add(new Developer("jason", new BigDecimal("100000"), 10));
        result.add(new Developer("iris", new BigDecimal("170000"), 55));

        return result;

    }

}

Sortie

Before Sort
Developer [name=example, salary=70000, age=33]
Developer [name=alvin, salary=80000, age=20]
Developer [name=jason, salary=100000, age=10]
Developer [name=iris, salary=170000, age=55]

After Sort
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=example, salary=70000, age=33]
Developer [name=iris, salary=170000, age=55]

3. Plus d'exemples Lambda

3.1 Sort By age

    //sort by age
    Collections.sort(listDevs, new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getAge() - o2.getAge();
        }
    });

    //lambda
    listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());

    //lambda, valid, parameter type is optional
    listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());

3.2 Sort by name

    //sort by name
    Collections.sort(listDevs, new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });

    //lambda
    listDevs.sort((Developer o1, Developer o2)->o1.getName().compareTo(o2.getName()));

    //lambda
    listDevs.sort((o1, o2)->o1.getName().compareTo(o2.getName()));

3.3 Sort by salary

    //sort by salary
    Collections.sort(listDevs, new Comparator() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getSalary().compareTo(o2.getSalary());
        }
    });

    //lambda
    listDevs.sort((Developer o1, Developer o2)->o1.getSalary().compareTo(o2.getSalary()));

    //lambda
    listDevs.sort((o1, o2)->o1.getSalary().compareTo(o2.getSalary()));

3.4 Reversed sorting.

3.4.1 Lambda expression to sort a List using their salary.

    Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
    listDevs.sort(salaryComparator);

Sortie

Developer [name=example, salary=70000, age=33]
Developer [name=alvin, salary=80000, age=20]
Developer [name=jason, salary=100000, age=10]
Developer [name=iris, salary=170000, age=55]

3.4.2 Lambda expression to sort a List using their salary, reversed order.

    Comparator salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
    listDevs.sort(salaryComparator.reversed());

Sortie

Developer [name=iris, salary=170000, age=55]
Developer [name=jason, salary=100000, age=10]
Developer [name=alvin, salary=80000, age=20]
Developer [name=example, salary=70000, age=33]