这是我参与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() 方法。我们可以看到它是如何更简洁、更易于阅读的。
结论
善于利用新的特性去优化自己的代码是非常有必要的,所以我们需要及时去了解新的特性