[译]Java 8的功能特性

这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战

前言

现在我们使用开发的主流版本还是Java 8,也是一个长期支持的版本,所以我们有必要去了解一下Java 8JDK的版本特性。

Java 8

Java 8 版本的主要变化如下:

  • Lambda 表达式和流 API(Lambda Expression and Stream API)
  • 方法引用(Method Reference)
  • 默认方法(Default Methods)
  • 类型注释(Type Annotations)
  • 重复注释(Repeating Annotations)
  • 方法参数反射(Method Parameter Reflection)

我们今天就介绍前两个特性:

Lambda 表达式和流 API(Lambda Expression and Stream API)

Java一直以拥有大量样板代码而闻名。随着Java 8的发布,这种说法变得不那么绝对了。流API和lambda表达式是使我们更接近函数式编程的新特性。在我们的示例中,我们将看到如何在不同场景中使用 lambda和流。

Lambda 表达式之前的用法

我们拥有一家汽车经销商业务。为了放弃所有的文书工作,我们想要创建一个软件来查找所有当前可用的行驶不到 50,000 公里的汽车。让我们看看我们如何以一种天真的方式实现这样的功能:

public class LambdaExpressions {
    public static List<Car> findCarsOldWay(List<Car> cars) {
        List<Car> selectedCars = new ArrayList<>();
        for (Car car : cars) {
            if (car.kilometers < 50000) {
                selectedCars.add(car);
            }
        }
        return selectedCars;
    }
}
复制代码

为了实现这一点,我们正在创建一个接受汽车列表的静态函数。它应该根据指定的条件返回一个过滤列表。

使用流和 Lambda 表达式

我们使用了与上一个示例相同的问题。 我们的客户希望找到所有具有相同标准的汽车。 让我们看一个使用流 API 和 lambda 表达式的解决方案:

public class LambdaExpressions {
    public static List<Car> findCarsUsingLambda(List<Car> cars) {
        return cars.stream().filter(car -> car.kilometers < 50000)
                .collect(Collectors.toList());
    }
}
复制代码

我们需要通过调用 stream()方法将汽车列表传输到流中。在filter()方法中,我们正在设置我们的条件。我们正在根据所需条件评估每个条目。我们只保留那些少于 50,000公里的条目。我们需要做的最后一件事是将其包装成一个列表。

方法引用(Method Reference)

没有使用方法引用

我们仍然拥有一家汽车经销店,我们想打印出店里的所有汽车。为此,我们将使用方法引用。 方法引用允许我们使用一种特殊的语法:: 来调用类中的函数。有四种方法引用:

  • 引用静态方法
  • 引用对象上的实例方法
  • 引用类型上的实例方法
  • 对构造函数的引用

我们使用 lambda 表达式在每辆车上调用 toString() 方法。

public class MethodReference {
    List<String> withoutMethodReference =
            cars.stream().map(car -> car.toString())
                    .collect(Collectors.toList());
}
复制代码

使用方法引用

现在,让我们看看如何在相同的情况下使用方法引用:

public class MethodReference {
    List<String> methodReference = cars.stream().map(Car::toString)
            .collect(Collectors.toList());
}
复制代码

我们再次使用 lambda 表达式,但现在我们通过方法引用调用 toString() 方法。我们可以看到它是如何更简洁、更易于阅读的。

结论

善于利用新的特性去优化自己的代码是非常有必要的,所以我们需要及时去了解新的特性

参考文献

(reflectoring.io/java-releas…)

Guess you like

Origin juejin.im/post/7061624851265486885