Java 8 Lambda 表達式比較器使用

引言

在這個例子中,咱們將向您展現如何使用 java8 lambda 表達式編寫一個 Comparator 來對 List 進行排序。html

  1. 經典的比較器示例:
Comparator<Developer> byName = new Comparator<Developer>() {
        @Override
        public int compare(Developer o1, Developer o2) {
            return o1.getName().compareTo(o2.getName());
        }
    };
  1. 使用 lambda:
Comparator<Developer> byName = 
        (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());

1.沒有 Lambda 的排序

先新建一個 Developer 類,而後比較 Developer 對象的年齡,一般咱們使用 Collections.sort 並傳遞匿名 Comparator 類,以下所示:java

package com.jimzhang.lambda;

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

/**
 * 〈一句話功能簡述〉<br> 〈排序〉
 *
 * @author zhangjinmiao
 * @create 2019/8/4 10:19
 */
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.toString());
    }

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

  }

  public static List<Developer> getDevelopers() {
    List<Developer> developers = new ArrayList<>();
    developers.add(new Developer("lisi", new BigDecimal("8000"),23));
    developers.add(new Developer("wangwu", new BigDecimal("9000"),24));
    developers.add(new Developer("maliu", new BigDecimal("10000"),25));
    developers.add(new Developer("zhangsan", new BigDecimal("7000"),22));
    return developers;
  }
}

當排序要求改變時,您只需傳入另外一個新的匿名 Comparator 類:git

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

這是可行的,可是,您是否以爲僅僅由於想要更改一行代碼就建立一個類有點奇怪?github

2.使用 Lambda 排序

在 Java 8 中,List 接口直接支持排序方法,再也不須要使用 Collections.sort。ide

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

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

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. 按薪水排序

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

4. 反向排序

  1. 薪水正序排序
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
    listDevs.sort(salaryComparator);

輸出:spa

Developer{name='zhangsan', salary=7000, age=22}
Developer{name='lisi', salary=8000, age=23}
Developer{name='wangwu', salary=9000, age=24}
Developer{name='maliu', salary=10000, age=25}

2.反向排序code

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

輸出:htm

Developer{name='maliu', salary=10000, age=25}
Developer{name='wangwu', salary=9000, age=24}
Developer{name='lisi', salary=8000, age=23}
Developer{name='zhangsan', salary=7000, age=22}
源碼見: java-8-demo

系列文章詳見:Java 8 教程對象

圖片描述

相關文章
相關標籤/搜索