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编程的道路上取得更大的成就!

相关推荐
码熔burning3 分钟前
JVM 面试精选 20 题(续)
jvm·面试·职场和发展
刘一说4 分钟前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos
卷福同学10 分钟前
来上海三个月,我在马路边上遇到了阿里前同事...
java·后端
野渡拾光1 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
bingbingyihao2 小时前
多数据源 Demo
java·springboot
tainshuai3 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
在努力的前端小白7 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
Coovally AI模型快速验证9 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun9 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
一叶飘零_sweeeet9 小时前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8