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 分钟前
Java基础之IO流
java·开发语言
WG_172 分钟前
C++多态
开发语言·c++·面试
小菜yh2 分钟前
关于Redis
java·数据库·spring boot·redis·spring·缓存
宇卿.9 分钟前
Java键盘输入语句
java·开发语言
浅念同学9 分钟前
算法.图论-并查集上
java·算法·图论
何不遗憾呢18 分钟前
每日刷题(算法)
算法
立志成为coding大牛的菜鸟.22 分钟前
力扣1143-最长公共子序列(Java详细题解)
java·算法·leetcode
鱼跃鹰飞22 分钟前
Leetcode面试经典150题-130.被围绕的区域
java·算法·leetcode·面试·职场和发展·深度优先
liangbm328 分钟前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
潮汐退涨月冷风霜34 分钟前
机器学习之非监督学习(四)K-means 聚类算法
学习·算法·机器学习