一、Lambda表达式
JDK 1.8引入了Lambda表达式,它是一种轻量级的匿名函数,可以作为参数传递到方法中或者用于函数式接口的创建。使用Lambda表达式可以简化代码,同时使得Java代码更像是一种函数式编程语言。
Lambda表达式的基本语法:
(parameter1, parameter2, ...) -> { // 方法体 }
其中,参数可以是任意类型,也可以为空,箭头"->"用于分隔参数和方法体,需要注意的是,方法体需要以大括号包围,而无需显式声明返回类型,JVM会根据上下文自动推断。
示例代码:
Listlist = Arrays.asList("apple", "orange", "banana"); list.sort((s1, s2) -> s1.compareTo(s2));
以上代码使用了Lambda表达式排序一个字符串列表,简化了代码,使得逻辑更加清晰。
二、Stream API
Stream API是一种强大的工具,用于处理集合和数组等数据源。它为我们提供了一种函数式编程的方法,并且可以在处理大量数据时提供比传统循环更高效的方式。
使用Stream API可以将常规的循环转换为更具有可读性的操作,同时提高代码的可维护性。
示例代码:
Listnumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum();
以上代码使用了Stream API求出一个列表中所有偶数的和。先使用filter过滤出偶数,然后使用mapToInt将Integer转换为int,最后使用sum求和。
三、接口的默认方法和静态方法
在JDK 1.8之前,接口中只能定义抽象方法,不能有方法的实现。但是,在JDK 1.8中,可以给接口增加默认方法和静态方法,这样就可以在接口中定义具体实现。
示例代码:
public interface Greeting { void sayHello(); default void sayHi() { System.out.println("Hi!"); } static void sayGoodbye() { System.out.println("Goodbye!"); } } public class GreetingImpl implements Greeting { public void sayHello() { System.out.println("Hello!"); } } //调用接口中的默认方法和静态方法 Greeting greeting = new GreetingImpl(); greeting.sayHello(); greeting.sayHi(); Greeting.sayGoodbye();
以上代码展示了如何定义一个接口中的默认方法和静态方法,并在实现类中覆盖抽象方法,同时调用接口中的默认方法和静态方法。
四、Optional类
Optional类是JDK 1.8新增的工具类,用于避免对于空对象的判断。在Java中,调用一个空对象的方法会导致NullPointerException的抛出,但是使用Optional类可以避免这种情况的发生。
示例代码:
OptionaloptionalName = Optional.ofNullable(name); if (optionalName.isPresent()) { String upperName = optionalName.get().toUpperCase(); System.out.println(upperName); } else { System.out.println("Name is null."); }
以上代码使用Optional类对可能为空的字符串进行了判断,如果字符串不为空,则将其转换为大写并输出;如果为空,则输出提示。
五、方法引用
在Lambda表达式中,有时仅仅需要将方法作为参数传递,这时可以使用方法引用。
示例代码:
Listfruits = Arrays.asList("apple", "orange", "banana"); fruits.forEach(System.out::println);
以上代码使用forEach方法将列表中的元素输出,使用了方法引用的方式。System.out::println是对于System.out.println方法的引用。
六、Base64编码
JDK 1.8新增了Base64编码和解码的API,可以用于处理二进制数据或者将二进制数据转换为文本格式。
示例代码:
import java.util.Base64; public class Base64Demo { public static void main(String[] args) { String message = "Hello, world"; byte[] encodedBytes = Base64.getEncoder().encode(message.getBytes()); System.out.println("Encoded message: " + new String(encodedBytes)); byte[] decodedBytes = Base64.getDecoder().decode(encodedBytes); System.out.println("Decoded message: " + new String(decodedBytes)); } }
以上代码展示了如何使用Base64对数据进行编码和解码。
七、新的日期和时间API
JDK 1.8引入了全新的日期和时间API,使用起来比旧的java.util.Date类更加简单、清晰,同时也更具可读性。
示例代码:
import java.time.LocalDate; public class DateDemo { public static void main(String[] args) { LocalDate today = LocalDate.now(); System.out.println("Today's date is: " + today); LocalDate future = today.plusDays(7); System.out.println("Date after 7 days is: " + future); } }
以上代码展示了如何使用LocalDate类操作日期,包括获取当前日期和计算未来日期。