Java 8 Lambda:コンパレータの例

java-lambda-expression、width = 344、height = 209

この例では、Java 8のラムダ式を使用してListをソートするための `Comparator`を書く方法を示します。

{空} 1。古典的な `Comparator`の例です。

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

{空} 2。ラムダ式に相当する。

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

1.ラムダなしでソートする

それらの年齢を使って `Developer`オブジェクトを比較する例です。通常、Collections.sort`を使用し、次のように匿名の `Comparator`クラスを渡します:

TestSorting.java

package com.mkyong.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<Developer> listDevs = getDevelopers();

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

       //sort by age
        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("mkyong", 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;

    }

}

出力

Before Sort
Developer[name=mkyong, 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=mkyong, salary=70000, age=33]Developer[name=iris, salary=170000, age=55]....

ソートの要件が変更されたら、別の新しい匿名の `Comparator`クラスを渡します:
//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());
     }
 });
それはうまくいきますが、1行のコードを変更したいからといってクラスを作成するのはちょっと変わったと思いますか?

===  2.ラムダでソートする

Java 8では、 `List`インターフェースは` sort`メソッドを直接サポートしていますので、 `Collections.sort`をもう使用する必要はありません。
   //List.sort() since Java 8
listDevs.sort(new Comparator<Developer>() {
    @Override
    public int compare(Developer o1, Developer o2) {
        return o2.getAge() - o1.getAge();
    }
});
ラムダ式の例:

TestSorting.java

package com.mkyong.java8;

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

public class TestSorting {

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, lambda also, to print the List
    listDevs.forEach((developer)->System.out.println(developer));
}
private static List<Developer> getDevelopers() {
List<Developer> result = new ArrayList<Developer>();
result.add(new Developer("mkyong", 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;
}

}

出力

Before Sort Developer[name=mkyong, 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=mkyong, salary=70000, age=33]Developer[name=iris, salary=170000, age=55]…​.

3.その他のラムダの例

3.1年齢別ソート

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

3.3給与によるソート

   //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()));

3.4逆ソート。

3.4.1ラムダ式。給与を使ってリストをソートする。

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

出力

Developer[name=mkyong, 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ラムダ式。給与、逆順を使用してリストをソートする。
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
listDevs.sort(salaryComparator.reversed());
出力

Developer[name=iris, salary=170000, age=55]Developer[name=jason, salary=100000, age=10]Developer[name=alvin, salary=80000, age=20]Developer[name=mkyong, salary=70000, age=33]…​.

次の投稿:Java MongoDB:JSONデータをDBObjectに変換する