您的位置:

Java8特性全面解析

一、Lambda表达式

Java8提供了一种新的语法--Lambda表达式,可以将方法作为参数传递给其他方法,能够极大的降低代码的复杂度。Lambda表达式有三部分组成:参数列表、箭头符和Lambda体。

第一部分:参数列表,可以为空或者包含一个或多个参数。

// 参数列表为空示例
() -> System.out.println("Hello Lambda!");

// 参数列表包含一个参数示例
(name) -> System.out.println("Hello " + name);

// 参数列表包含多个参数示例
(n1, n2) -> System.out.println(n1 + n2);

第二部分:箭头符“->”,将参数列表和Lambda体分隔开。

第三部分:Lambda体,包含了一个或多个语句,可以是一个表达式,也可以是一个代码块。

// Lambda表达式是一个表达式示例
(int x, int y) -> x + y

// Lambda表达式是一个代码块示例
(int x, int y) -> {
    int sum = x + y;
    System.out.println(sum);
}

二、Stream API

Java8引入了Stream API,是一种新的集合处理方式,能够让你更容易地使用集合。它提供了一种流式的处理方式,并行处理很方便。Stream API的核心是Stream接口,它包含了很多实用的操作方法,如过滤、映射、排序等操作。

使用Stream API,可以将循环和过滤操作只用一行代码实现,例如:

List list = Arrays.asList("apple", "banana", "orange");
list.stream()
    .filter(s -> s.startsWith("a"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

  

上述代码中,我们将一个字符串集合转换为一个流,在这个流中过滤出以字母a开头的字符串,将它们转换为大写并排序输出。

三、接口的默认方法

Java8允许在接口中添加默认方法,这些方法可以在接口的实现类中直接使用,无需再次实现。接口的默认方法只有在实现类中没有自己的同名方法时才会被调用。

public interface MyInterface {
    default void myDefaultMethod() {
        System.out.println("This is a default method.");
    }
}

public class MyClass implements MyInterface {
    // 无需再次实现myDefaultMethod()方法
}

四、方法引用

Java8中,方法引用是一种特殊的Lambda表达式,它使用::指示符,可以让代码更加简洁易读。

方法引用分为4种类型:

  • 静态方法引用。例如:Math::max。
  • 实例方法引用。例如:String::toUpperCase。
  • 构造函数引用。例如:ArrayList::new。
  • 超类方法引用。例如:super::toString。

使用方法引用可以将Lambda表达式中的代码更加简洁易懂,例如:

List list = Arrays.asList(1, 2, 3);
list.stream().forEach(System.out::println);

  

上述代码中,我们可以使用方法引用System.out::println代替Lambda表达式(t -> System.out.println(t)),使代码更加简洁。

五、Optional类

Java8引入了Optional类,它是一个容器类型,可以包含一个对于某个类型的值或者代表该值不存在的null。

Optional类的主要方法如下:

  • Optional.of(T value):创建一个Optional实例,value不能为null。
  • Optional.empty():创建一个空的Optional实例。
  • Optional.ofNullable(T value):创建一个Optional实例,value可以为null。
  • isPresent():判断Optional实例是否包含值。
  • get():获取Optional实例包含的值,前提是该值存在。

Optional类可以帮助我们更好地处理null,如下面的例子:

Integer value1 = null;
Integer value2 = 10;
Optional opt1 = Optional.ofNullable(value1);
Optional
    opt2 = Optional.of(value2);
System.out.println(opt1.orElse(0) + opt2.get());

   
  

上述代码中,我们使用Optional类来避免空指针异常。如果value1为空,则opt1包含的值为null,调用orElse(0)方法返回0;如果value2不为空,则使用opt2.get()方法获取opt2包含的值。