Java 8作为Java语言的一个重要版本,引入了许多新特性和改进,使得编程更加高效和便捷。本文将详细介绍Java 8的核心新特性,并通过实战案例帮助你轻松提升编程效率。

一、Lambda表达式与Stream API

1. Lambda表达式

Lambda表达式是Java 8引入的一项重要特性,它允许我们用更简洁的代码来表示匿名函数。以下是一个使用Lambda表达式的例子:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

strings.stream()
      .filter(s -> !s.isEmpty())
      .forEach(System.out::println);

在这个例子中,我们使用Lambda表达式来过滤掉空字符串,并打印出非空字符串。

2. Stream API

Stream API是Java 8引入的另一项重要特性,它允许我们对集合进行并行处理,提高程序性能。以下是一个使用Stream API的例子:

List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");

long count = strings.parallelStream()
                     .filter(s -> !s.isEmpty())
                     .count();

System.out.println(count);

在这个例子中,我们使用parallelStream()方法来并行处理集合,并计算非空字符串的数量。

二、函数式接口与默认方法

1. 函数式接口

函数式接口是只有一个抽象方法的接口,它允许我们使用Lambda表达式来表示该接口的实现。以下是一个函数式接口的例子:

@FunctionalInterface
interface MyInterface {
    void doSomething();
}

public class Main {
    public static void main(String[] args) {
        MyInterface myInterface = () -> System.out.println("Hello, World!");
        myInterface.doSomething();
    }
}

在这个例子中,我们定义了一个函数式接口MyInterface,并使用Lambda表达式来表示它的实现。

2. 默认方法

默认方法允许我们为接口添加一个非抽象方法,该方法的实现由接口提供。以下是一个包含默认方法的接口的例子:

interface MyInterface {
    void doSomething();

    default void doSomethingElse() {
        System.out.println("Default method");
    }
}

public class Main {
    public static void main(String[] args) {
        MyInterface myInterface = () -> System.out.println("Hello, World!");
        myInterface.doSomething();
        myInterface.doSomethingElse();
    }
}

在这个例子中,我们定义了一个包含默认方法的接口MyInterface,并在主方法中调用这些方法。

三、日期和时间API

Java 8引入了新的日期和时间API,它提供了更简洁和强大的日期处理功能。以下是一个使用新日期和时间API的例子:

LocalDate date = LocalDate.of(2018, 4, 24);
LocalTime time = LocalTime.of(12, 30);
LocalDateTime dateTime = LocalDateTime.of(date, time);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = dateTime.format(formatter);

System.out.println(formattedDateTime);

在这个例子中,我们使用LocalDate、LocalTime和LocalDateTime来表示日期、时间和日期时间,并使用DateTimeFormatter来格式化日期时间字符串。

四、实战案例:使用Java 8特性优化代码

以下是一个使用Java 8特性优化代码的实战案例:

假设我们有一个学生类,其中包含学生的姓名、年龄和成绩。我们需要根据成绩对学生进行排序,并找出成绩最高的学生。

import java.util.*;
import java.util.stream.Collectors;

class Student {
    private String name;
    private int age;
    private int score;

    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getScore() {
        return score;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
}

public class Main {
    public static void main(String[] args) {
        List<Student> students = Arrays.asList(
                new Student("Alice", 20, 90),
                new Student("Bob", 21, 85),
                new Student("Charlie", 22, 95)
        );

        List<Student> sortedStudents = students.stream()
                .sorted(Comparator.comparingInt(Student::getScore).reversed())
                .collect(Collectors.toList());

        Student topStudent = sortedStudents.get(0);
        System.out.println("Top student: " + topStudent);
    }
}

在这个例子中,我们使用Stream API对学生列表进行排序,并找出成绩最高的学生。通过使用Java 8的新特性,我们能够以更简洁和高效的方式实现这个功能。

通过以上介绍,相信你已经掌握了Java 8的核心新特性。在实际编程过程中,熟练运用这些特性可以帮助你提高编程效率,并写出更简洁、易读的代码。