Java 8 中 20 个高频面试题及答案

2024-07-29 07:56:34 浏览数 (2)

前言

自 Java 8 发布以来已经过去了 8 年,Java 8 引入了许多新特性,‌包括改进的日期和时间 API、‌Lambda 表达式、‌方法引用、‌默认方法、‌以及 Nashorn JavaScript 引擎等。‌这些新特性不仅增强了 Java 的开发效率和功能性,‌也为面试中的 Java 8 相关问题提供了丰富的素材。‌

在本教程中,我将分享 20 个顶级的 Java 8 编码和编程面试题及答案。我只使用了 Stream API 函数来解决以下问题。

这些问题的答案涵盖了 Java 8 中的一些核心特性和改进,‌对于理解 Java 8 的新特性和如何使用它们非常有帮助

20 道高频题

问题 1:给定一个整数列表,使用 Stream 函数找出列表中所有的偶数?

Java 8 中的 Stream API 提供了一种简洁且高效的方法来处理集合数据。以下是解决这个问题的代码示例:

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class EvenNumber {
    public static void main(String args[]) {
        List<Integer> list = Arrays.asList(10, 15, 8, 49, 25, 98, 32);
        list.stream()
            .filter(n -> n % 2 == 0)
            .forEach(System.out::println);
    }
}

输出:

代码语言:java复制
10, 8, 98, 32

问题 2:给定一个整数列表,使用 Stream 函数找出所有以 1 开头的数字?

通过 Stream API,可以很容易地找到以特定数字开头的元素。以下是代码示例:

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class NumberStartingWithOne {
    public static void main(String args[]) {
        List<Integer> myList = Arrays.asList(10, 15, 8, 49, 25, 98, 32);
        myList.stream()
              .map(s -> s   "") // 将整数转换为字符串
              .filter(s -> s.startsWith("1"))
              .forEach(System.out::println);
    }
}

输出:

代码语言:java复制
10, 15

问题 3:如何使用 Stream 函数在给定的整数列表中找到重复元素?

利用 Stream API,我们可以轻松找到列表中的重复元素。以下是两种方法:

方法1:

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class DuplicateElements {
    public static void main(String args[]) {
        List<Integer> myList = Arrays.asList(10, 15, 8, 49, 25, 98, 98, 32, 15);
        Set<Integer> set = new HashSet<>();
        myList.stream()
              .filter(n -> !set.add(n))
              .forEach(System.out::println);
    }
}

输出:

代码语言:java复制
98, 15

方法2:使用 distinct() 关键字

代码语言:java复制
public static void getDataWithoutDuplicates() {
    List<Integer> myList = Arrays.asList(1, 1, 85, 6, 2, 3, 65, 6, 45, 45, 5662, 2582, 2, 2, 266, 666, 656);
    myList.stream().distinct().forEach(noDuplicateData -> System.out.println(noDuplicateData));
}

输出:

代码语言:java复制
1, 85, 6, 2, 3, 65, 45, 5662, 2582, 266, 666, 656

问题4:给定一个整数列表,使用 Stream 函数找出列表中的第一个元素?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class FindFirstElement {
    public static void main(String args[]) {
        List<Integer> myList = Arrays.asList(10, 15, 8, 49, 25, 98, 98, 32, 15);
        myList.stream()
              .findFirst()
              .ifPresent(System.out::println);
    }
}

输出:

代码语言:java复制
10

问题5:给定一个整数列表,使用 Stream 函数计算列表中元素的总数?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class FindTheTotalNumberOfElements {
    public static void main(String args[]) {
        List<Integer> myList = Arrays.asList(10, 15, 8, 49, 25, 98, 98, 32, 15);
        long count = myList.stream().count();
        System.out.println(count);
    }
}

输出:

代码语言:java复制
9

问题 6:给定一个整数列表,使用 Stream 函数找出其中的最大值?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class FindMaxElement {
    public static void main(String args[]) {
        List<Integer> myList = Arrays.asList(10, 15, 8, 49, 25, 98, 98, 32, 15);
        int max = myList.stream().max(Integer::compare).get();
        System.out.println(max);
    }
}

输出:

代码语言:java复制
98

问题 7:给定一个字符串,使用 Stream 函数找出其中第一个不重复的字符?

代码语言:java复制
import java.util.*;
import java.util.stream.*;
import java.util.function.Function;

public class FirstNonRepeated {
    public static void main(String args[]) {
        String input = "Java articles are Awesome";
        Character result = input.chars() // 字符串流
                                .mapToObj(s -> Character.toLowerCase(Character.valueOf((char) s))) // 首先转换为Character对象,然后转换为小写
                                .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())) // 存储字符及其计数
                                .entrySet()
                                .stream()
                                .filter(entry -> entry.getValue() == 1L)
                                .map(entry -> entry.getKey())
                                .findFirst()
                                .get();
        System.out.println(result);
    }
}

输出:

代码语言:java复制
j

问题 8:给定一个字符串,使用 Stream 函数找出其中第一个重复的字符?

代码语言:java复制
import java.util.*;
import java.util.stream.*;
import java.util.function.Function;

public class FirstRepeated {
    public static void main(String args[]) {
        String input = "Java Articles are Awesome";
        Character result = input.chars() // 字符串流
                                .mapToObj(s -> Character.toLowerCase(Character.valueOf((char) s))) // 首先转换为Character对象,然后转换为小写
                                .collect(Collectors.groupingBy(Function.identity(), LinkedHashMap::new, Collectors.counting())) // 存储字符及其计数
                                .entrySet()
                                .stream()
                                .filter(entry -> entry.getValue() > 1L)
                                .map(entry -> entry.getKey())
                                .findFirst()
                                .get();
        System.out.println(result);
    }
}

输出:

代码语言:java复制
a

问题 9:给定一个整数列表,使用 Stream 函数对列表中的值进行排序?

代码语言:java复制
import java.util.*;
import java.util.stream.*;
import java.util.function.Function;

public class SortValues {
    public static void main(String args[]) {
        List<Integer> myList = Arrays.asList(10, 15, 8, 49, 25, 98, 98, 32, 15);
        myList.stream().sorted().forEach(System.out::println);
    }
}

输出:

代码语言:java复制
8
10
15
15
25
32
49
98
98

问题 10:给定一个整数列表,使用 Stream 函数按降序排序列表中的值?

代码语言:java复制
import java.util.*;
import java.util.stream.*;
import java.util.function.Function;

public class SortDescending {
    public static void main(String args[]) {
        List<Integer> myList = Arrays.asList(10, 15, 8, 49, 25, 98, 98, 32, 15);
        myList.stream().sorted(Collections.reverseOrder()).forEach(System.out::println);
    }
}

输出:

代码语言:java复制
98
98
49
32
25
15
15
10
8

问题 11:给定一个整数数组 nums,如果数组中任何值至少出现两次则返回 true,如果每个元素都不同则返回 false?

代码语言:java复制
public boolean containsDuplicate(int[] nums) {
    List<Integer> list = Arrays.stream(nums).boxed().collect(Collectors.toList());
    Set<Integer> set = new HashSet<>(list);
    return set.size() != list.size();
}

输入:

代码语言:java复制
nums = [1,2,3,1]

输出:

代码语言:java复制
true

输入:

代码语言:java复制
nums = [1,2,3,4]

输出:

代码语言:java复制
false

问题 12:如何使用 Java 8 Date 和 Time API 获取当前日期和时间?

代码语言:java复制
class Java8 {
    public static void main(String[] args) {
        System.out.println("Current Local Date: "   java.time.LocalDate.now());
        // 使用LocalDate API获取日期
        System.out.println("Current Local Time: "   java.time.LocalTime.now());
        // 使用LocalTime API获取时间
        System.out.println("Current Local Date and Time: "   java.time.LocalDateTime.now());
        //
        ```java
        // 使用LocalDateTime API获取日期和时间
        System.out.println("Current Instant: "   java.time.Instant.now());
        // 使用Instant获取时间戳
    }
}

输出:

代码语言:java复制
Current Local Date: 2024-07-22
Current Local Time: 12:34:56.789
Current Local Date and Time: 2024-07-22T12:34:56.789
Current Instant: 2024-07-22T04:34:56.789Z

问题 13:如何使用 Stream 函数将一个字符串列表连接成一个单独的字符串?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class JoinStrings {
    public static void main(String args[]) {
        List<String> list = Arrays.asList("Java", "is", "fun");
        String result = list.stream()
                            .collect(Collectors.joining(" "));
        System.out.println(result);
    }
}

输出:

代码语言:java复制
Java is fun

问题 14:给定一个字符串数组,使用 Stream 函数找出其中最长的字符串?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class LongestString {
    public static void main(String args[]) {
        String[] words = {"Java", "Stream", "API", "Programming", "Language"};
        String longest = Arrays.stream(words)
                               .max(Comparator.comparingInt(String::length))
                               .orElse(null);
        System.out.println(longest);
    }
}

输出:

代码语言:java复制
Programming

问题 15:如何使用 Stream 函数将一个数字列表转换为它们的平方数列表?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class SquareNumbers {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> squares = numbers.stream()
                                       .map(n -> n * n)
                                       .collect(Collectors.toList());
        System.out.println(squares);
    }
}

输出:

代码语言:java复制
[1, 4, 9, 16, 25]

问题 16:如何使用 Stream 函数计算整数列表的平均值?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class AverageValue {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50);
        double average = numbers.stream()
                                .mapToInt(Integer::intValue)
                                .average()
                                .orElse(0.0);
        System.out.println(average);
    }
}

输出:

代码语言:java复制
30.0

问题 17:如何使用 Stream 函数找出字符串列表中所有不为空且长度大于 3 的字符串?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class FilterStrings {
    public static void main(String args[]) {
        List<String> strings = Arrays.asList("Java", "", "Stream", "API", "Programming", "");
        List<String> filtered = strings.stream()
                                       .filter(s -> !s.isEmpty() && s.length() > 3)
                                       .collect(Collectors.toList());
        System.out.println(filtered);
    }
}

输出:

代码语言:java复制
[Java, Stream, Programming]

问题 18:如何使用 Stream 函数找出字符串列表中最长的字符串的长度?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class LongestStringLength {
    public static void main(String args[]) {
        List<String> strings = Arrays.asList("Java", "Stream", "API", "Programming", "Language");
        int maxLength = strings.stream()
                               .mapToInt(String::length)
                               .max()
                               .orElse(0);
        System.out.println(maxLength);
    }
}

输出:

代码语言:java复制
11

问题 19:如何使用 Stream 函数对字符串列表进行排序并转换为大写?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class SortAndUppercase {
    public static void main(String args[]) {
        List<String> strings = Arrays.asList("java", "stream", "api", "programming", "language");
        List<String> sortedAndUppercase = strings.stream()
                                                 .sorted()
                                                 .map(String::toUpperCase)
                                                 .collect(Collectors.toList());
        System.out.println(sortedAndUppercase);
    }
}

输出:

代码语言:java复制
[API, JAVA, LANGUAGE, PROGRAMMING, STREAM]

问题 20:如何使用 Stream 函数将一个整数列表中的所有元素翻倍?

代码语言:java复制
import java.util.*;
import java.util.stream.*;

public class DoubleValues {
    public static void main(String args[]) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> doubled = numbers.stream()
                                       .map(n -> n * 2)
                                       .collect(Collectors.toList());
        System.out.println(doubled);
    }
}

输出:

代码语言:java复制
[2, 4, 6, 8, 10]

结语

以上问题和解决方案展示了如何利用 Java 8 中的 Stream API 进行高效的数据处理。这些示例不仅帮助你准备面试问题,还可以作为实际开发中的参考。

通过这些示例,你可以看到 Stream API 在处理集合数据时的强大功能和简洁语法。这些技能对于现代 Java 开发者来说至关重要,特别是在处理大数据集和实现复杂的数据操作时。

希望这些内容对你有所帮助,并祝你在Java编程的道路上取得更大的成就!

0 人点赞