📜  Java 8-方法参考(1)

📅  最后修改于: 2023-12-03 15:01:28.248000             🧑  作者: Mango

Java 8 - 方法参考

Java 8 添加了许多新的方法和函数式接口,这些方法和接口可以在编写 Java 8 代码时发挥作用。本文将介绍一些常用的 Java 8 方法和函数式接口。

方法引用

Java 8 添加了一种新的语法叫做方法引用。方法引用允许你直接引用类或对象中的方法作为 lambda 表达式。方法引用分为四种类型:

  • 静态方法引用:Class::staticMethod
  • 实例方法引用:instance::method
  • 构造方法引用:Class::new
  • 数组引用:Type[]::new

下面是一个例子:

List<String> names = Arrays.asList("bob", "alice", "charlie");

// Lambda 表达式写法
names.stream().map(name -> name.toUpperCase())

// 方法引用写法
names.stream().map(String::toUpperCase)

这两种写法是等效的。

Stream API

Java 8 中引入了新的 Stream API,它允许你以一种类似于 SQL 查询的方式对集合进行操作。Stream API 是一种基于管道(pipeline)的处理方式,可以通过链式调用方法来实现多个操作。

下面是一个例子:

List<String> names = Arrays.asList("bob", "alice", "charlie");

long count = names.stream()
    .filter(name -> name.length() > 4)
    .count();

System.out.println("Names with length > 4: " + count);

这里使用了 filtercount 两个方法来实现了对集合的过滤,并统计符合条件的元素的个数。

Optional

Java 8 中引入了新的 Optional 类型,它可以包装任意类型的值,并提供了一些操作方法来判断是否存在值。使用 Optional 可以避免出现空指针异常(NullPointerException)。

下面是一个例子:

Optional<String> maybeName = Optional.ofNullable(null);

if (maybeName.isPresent()) {
    String name = maybeName.get();
    System.out.println("Hello, " + name + "!");
} else {
    System.out.println("Hello, stranger!");
}

这里使用了 ofNullable 方法来创建一个 Optional 对象,并使用 isPresentget 方法来判断是否存在值和获取包装的值。

函数式接口

Java 8 引入了许多新的函数式接口,它们是一种通过方法引用或 lambda 表达式传递行为的方式。

下面是一些常用的函数式接口:

  • Predicate:接收一个参数并返回 boolean 类型的结果。
  • Function:接收一个参数并返回一个结果。
  • Consumer:接收一个参数并不返回结果。
  • Supplier:不接收参数但返回一个结果。
  • BiPredicate、BiFunction、BiConsumer:与上述接口类似,但接受两个参数。

下面是一个例子:

List<String> names = Arrays.asList("bob", "alice", "charlie");

Predicate<String> startsWithB = name -> name.startsWith("b");
names.stream().filter(startsWithB).forEach(System.out::println);

这里使用了 Predicate 接口来过滤集合中以 "b" 开头的元素,并使用 forEach 方法来打印符合条件的元素。

总结

Java 8 的新特性让程序员可以更加轻松地编写并发和函数式编程,同时也提高了代码的可读性和可维护性。希望本文对您有所帮助!