一、Stream流
Java8中新增了Stream API,它是一个用来处理数据集合的API。Stream API可以让代码更加简洁易读,并且提高了代码运行的效率。Stream流提供了许多操作方法,比如对集合中的元素进行过滤、排序、分组等等。
下面是一个简单的Stream流操作,用来过滤出集合中所有的偶数:
Listnumbers = Arrays.asList(1, 2, 3, 4, 5, 6); numbers.stream() .filter(n -> n % 2 == 0) .forEach(System.out::println);
上面的代码中,先将集合转化为一个Stream流,然后使用filter方法过滤掉不符合条件的元素,最后使用forEach方法对剩下的元素进行遍历输出。
二、Lambda表达式
Java8中引入了Lambda表达式,它是一种匿名函数,可以简化函数式接口的实现方式。Lambda表达式使用箭头符号 "->" 来连接参数和函数体。
下面是一个使用Lambda表达式的例子:
Listnumbers = Arrays.asList(1, 2, 3, 4, 5, 6); numbers.forEach((n) -> System.out.println(n));
上面的代码中,forEach方法使用Lambda表达式来实现对每个元素的输出。Lambda表达式简化了代码的书写,使代码更加易读易懂。
三、Optional类
Java8中引入了Optional类,它用来解决NullPointerException异常的问题。Optional类可以将一个可能为空的对象包装起来,如果该对象为空,就返回一个空的Optional对象,否则就返回一个包含该对象的Optional对象。
下面是一个使用Optional类的例子:
Optionalname = Optional.of("John"); System.out.println(name.get());
上面的代码中,使用Optional.of方法创建了一个Optional对象,然后使用get方法获取Optional对象中的值。如果Optional对象为空,就会抛出NoSuchElementException异常。
四、接口中的默认方法和静态方法
Java8中引入了接口中的默认方法和静态方法。默认方法可以在不破坏原有接口的前提下为接口添加新的方法,而静态方法则可以为接口提供一些通用的功能。
下面是一个使用默认方法的例子:
public interface MyInterface { default void sayHello() { System.out.println("Hello World"); } } public class MyClass implements MyInterface { // ... } public static void main(String[] args) { MyInterface obj = new MyClass(); obj.sayHello(); }
上面的代码中,MyInterface接口中定义了一个默认方法sayHello,MyClass类实现了MyInterface接口,然后通过MyInterface类型的引用调用sayHello方法。此时,sayHello方法就会输出"Hello World"。
五、函数式接口
Java8中引入了函数式接口,它是只有一个抽象方法的接口。函数式接口可以用来表示Lambda表达式和方法引用的目标类型。
下面是一个使用函数式接口的例子:
public interface MyFunctionalInterface { void sayHello(); } public class MyClass { public static void main(String[] args) { MyFunctionalInterface obj = () -> System.out.println("Hello World"); obj.sayHello(); } }
上面的代码中,MyFunctionalInterface接口定义了一个抽象方法sayHello,然后在MyClass类中使用Lambda表达式实现了该接口,最后调用接口的sayHello方法输出 "Hello World"。