Java 8用函数式编程实现集合操作案例

17-04-05 banq
    

for和while是传统Java用于遍历集合的经典方法,本文代码演示如何使用Java8函数式lambda替代这两条语句。

假设对集合进行筛选后排序,传统代码如下:

public static List<String> getModelsAfter2000UsingFor(List<Car> cars) {
    List<Car> carsSortedByYear = new ArrayList<>();
 
    for(Car car : cars) {
      if(car.getYear() > 2000) {
        carsSortedByYear.add(car);
      }
    }
     
    Collections.sort(carsSortedByYear, new Comparator<Car>() {
      public int compare(Car car1, Car car2) {
        return new Integer(car1.getYear()).compareTo(car2.getYear());
      }
    });
     
    List<String> models = new ArrayList<>();
    for(Car car : carsSortedByYear) {
      models.add(car.getModel());
    }
     
    return models;
  }
<p>

这里是将Car日期在2000年以后的筛选出来放到carsSortedByYear这个临时集合,再根据日期排序,再转为一个新的models集合,完成整个过程需要两个临时集合做转换。

而使用Java 8的管道组合则简单一句:

public static List<String> getModelsAfter2000UsingPipeline(
   List<Car> cars) {
   return 
     cars.stream()
         .filter(car -> car.getYear() > 2000)
         .sorted(Comparator.comparing(Car::getYear))
         .map(Car::getModel)
         .collect(toList());
 }
<p>

Java 8 idioms, Part 2: Function composition and th