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

前言

自 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);
    }
}

输出:

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);
    }
}

输出:

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);
    }
}

输出:

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));
}

输出:

yaml 复制代码
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);
    }
}

输出:

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);
    }
}

输出:

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);
    }
}

输出:

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);
    }
}

输出:

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);
    }
}

输出:

css 复制代码
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);
    }
}

输出:

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);
    }
}

输出:

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();
}

输入:

ini 复制代码
nums = [1,2,3,1]

输出:

arduino 复制代码
true

输入:

ini 复制代码
nums = [1,2,3,4]

输出:

arduino 复制代码
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获取时间戳
    }
}

输出:

sql 复制代码
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);
    }
}

输出:

kotlin 复制代码
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);
    }
}

输出:

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);
    }
}

输出:

csharp 复制代码
[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);
    }
}

输出:

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);
    }
}

输出:

arduino 复制代码
[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);
    }
}

输出:

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);
    }
}

输出:

csharp 复制代码
[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);
    }
}

输出:

csharp 复制代码
[2, 4, 6, 8, 10]

结语

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

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

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

相关推荐
菜鸡中的奋斗鸡→挣扎鸡1 分钟前
滑动窗口 + 算法复习
数据结构·算法
Lenyiin10 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码17 分钟前
Cmd命令大全(万字详细版)
python·算法·小程序
装不满的克莱因瓶30 分钟前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
scan72432 分钟前
LILAC采样算法
人工智能·算法·机器学习
n北斗37 分钟前
常用类晨考day15
java
骇客野人40 分钟前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言
菌菌的快乐生活1 小时前
理解支持向量机
算法·机器学习·支持向量机
大山同学1 小时前
第三章线性判别函数(二)
线性代数·算法·机器学习
axxy20001 小时前
leetcode之hot100---240搜索二维矩阵II(C++)
数据结构·算法