Mẹo vặt cuộc sống, Sức khỏe, Giải đáp, Hướng dẫn

Tổng quan Java 8 Lambda: Một số ví dụ cho Comparator

0

Trong bài viết này mình sẽ giới thiệu với các bạn cách sử dụng biểu thức Lambda trong Java 8 để viết một một Comparator để sắp xếp một List

Classic Comparator

Khi tạo một đối tượng Comparator (anonymous class), chúng ta cần override phương thức compare(Object o1, Object o2) của Comparator.

Dưới đây là đoạn code để tạo một đối tượng Comparator byName, dùng để so sánh 2 đối tượng Developer thông qua tên của chúng.

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

Biểu thức Lambda

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

Đây là biểu thức Lambda để tạo một đối tượng tương đương về mặt logic với byName trong phần trên.

Sắp xếp không dùng Lambda

Ví dụ cho việc so sánh các đối tượng Developer sử dụng thuộc tính tuổi của chúng. Thông thường, chúng ta sử dụng Collection.sort() và truyền vào một anonymous Comparator class như sau:

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

public class ComparatorExample {

    public static void main(String[] args) {
        List<Developer> listDevs = getDevelopers();
        System.out.println("Before Sort");
        for (Developer developer : listDevs) {
            System.out.println(developer);
        }
        Collections.sort(listDevs, new Comparator<Developer>() {
            @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<Developer> getDevelopers() {
        List<Developer> result = new ArrayList<Developer>();
        result.add(new Developer("alvin", new BigDecimal("70000"), 33));
        result.add(new Developer("lboy", new BigDecimal("80000"), 20));
        result.add(new Developer("tboy", new BigDecimal("100000"), 10));
        result.add(new Developer("ana", new BigDecimal("170000"), 55));
        return result;
    }
}

Output:

Output without Lambda
Output without Lambda

Khi các bạn muốn sắp xếp theo thuộc tính khác, chỉ cần viết và thay đổi anonymous Comparator class thành một class khác.

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

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

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

It’s work, nhưng bạn có nghĩ rằng việc phải tạo một class mới chỉ vì bạn muốn thay đổi một dòng code trong đó có hơi kỳ?

Sắp xếp sử dụng Lambda

Với Java 8, interface List đã khai báo phương thức sort nên chúng ta không cần thiết phải dùng Comparator

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

Biểu thức Lambda:

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

public class ComparatorExample {

    public static void main(String[] args) {
        List<Developer> 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
        listDevs.forEach((developer) -> System.out.println(developer));
    }

    private static List<Developer> getDevelopers() {
        List<Developer> result = new ArrayList<Developer>();
        result.add(new Developer("tle220", new BigDecimal("70000"), 33));
        result.add(new Developer("alvin", new BigDecimal("80000"), 20));
        result.add(new Developer("abson", new BigDecimal("100000"), 10));
        result.add(new Developer("iris", new BigDecimal("170000"), 55));
        return result;
    }
}

Output

Output Lambda Sort
Output Lambda Sort

More Examples

Sắp xếp theo age

//sort by name
Collections.sort(listDevs, new Comparator<Developer>() {
	@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()));

Sắp xếp theo salary

//sort by salary
Collections.sort(listDevs, new Comparator<Developer>() {
	@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()));

Sắp xếp theo tên

//sort by name
Collections.sort(listDevs, new Comparator<Developer>() {
	@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()));

Cảm ơn các bạn.

Nguồn: mkyong

Leave A Reply

Your email address will not be published.