一、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,可以将循环和过滤操作只用一行代码实现,例如:
Listlist = 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表达式中的代码更加简洁易懂,例如:
Listlist = 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; Optionalopt1 = 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包含的值。