Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

  • Java 8 + 特性类

    • 使用 Java 8 的优点是什么?
      • 集合与流有何不同?
      • 什么是 Lambda 表达式?
      • 解释 Predicate 和 Consumer 函数式接口
      • peek () 方法在 Java 8 中的作用?
      • 什么是函数式接口?
      • 接口中的静态方法有什么作用?
      • skip (long) 和 limit (long) 的区别?
      • 抽象类和接口的异同?
      • overload 与 override 的区别?
      • HashMap 在 Java 8 中的变化?
      • HashMap、LinkedHashMap、Hashtable、ConcurrentHashMap 的区别?
      • Lambda 参数列表与箭头运算符的作用?
      • sleep () 和 wait () 的区别?
      • throw 与 throws 的区别?
      • final、finally、finalize 的区别?
      • Collection 与 Collections 的区别
      • ArrayList、LinkedList、Vector 的区别?
    • 其他技术类

    • 常见面试题
    • Java 8 + 特性类
    刘博
    2025-12-29
    目录

    使用 Java 8 的优点是什么?

    # 1. Lambda 表达式:简化代码,告别冗余匿名类

    这是 Java 8 最直观的优点。它允许你将行为像数据一样传递,大幅简化了匿名内部类的写法,让代码更简洁、易读。

    对比示例:遍历集合

    • Java 7 及之前(匿名内部类):
    List<String> list = Arrays.asList("Java", "Python", "C++");
    // 遍历集合
    for (String s : list) {
        System.out.println(s);
    }
    // 或使用匿名内部类(如排序)
    Collections.sort(list, new Comparator<String>() {
        @Override
        public int compare(String s1, String s2) {
            return s1.length() - s2.length();
        }
    });
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    • Java 8(Lambda 表达式):
    List<String> list = Arrays.asList("Java", "Python", "C++");
    // 遍历
    list.forEach(s -> System.out.println(s));
    // 排序
    Collections.sort(list, (s1, s2) -> s1.length() - s2.length());
    
    1
    2
    3
    4
    5

    可以看到,Lambda 把原本需要写多行的匿名类代码简化成了一行,逻辑更聚焦。

    # 2. Stream API:高效处理集合,支持函数式编程

    Stream API 是配合 Lambda 的“利器”,专门用于处理集合(List/Set/Map 等),支持过滤、映射、排序、聚合等操作,代码更简洁,还能轻松实现并行处理提升效率。

    示例:筛选并处理集合

    List<String> list = Arrays.asList("Java8", "Python", "C++", "JavaSE");
    // 需求:筛选以Java开头的字符串,转大写,收集到新列表
    List<String> result = list.stream()
        .filter(s -> s.startsWith("Java")) // 过滤
        .map(String::toUpperCase) // 转换大写
        .collect(Collectors.toList()); // 收集结果
    System.out.println(result); // 输出:[JAVA8, JAVASE]
    
    // 并行处理(自动利用多核CPU)
    List<String> parallelResult = list.parallelStream()
        .filter(s -> s.startsWith("Java"))
        .map(String::toUpperCase)
        .collect(Collectors.toList());
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13

    相比传统的 for 循环遍历+判断,Stream API 让代码“声明式”(告诉程序要做什么,而非怎么做),可读性和维护性大幅提升。

    # 3. Optional 类:避免空指针异常(NPE)

    空指针是 Java 开发中最常见的异常之一,Java 8 引入 Optional 类,通过封装可能为 null 的值,强制开发者处理 null 情况,从根源上减少 NPE。

    示例:

    // Java 7 及之前:需要手动判空
    String name = getUser().getName();
    if (name != null) {
        System.out.println(name.length());
    }
    
    // Java 8:使用 Optional 优雅处理
    Optional<String> optionalName = Optional.ofNullable(getUser().getName());
    optionalName.ifPresent(n -> System.out.println(n.length())); // 仅当值非空时执行
    String defaultName = optionalName.orElse("默认名称"); // 空时返回默认值
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    # 4. 接口默认方法和静态方法:增强接口扩展性

    Java 8 允许接口中定义 default(默认)方法和 static(静态)方法,解决了“接口修改导致所有实现类必须修改”的问题,让接口可以新增功能而不破坏现有代码。

    示例:

    interface Greeting {
        // 抽象方法
        void sayHello();
        
        // 默认方法(实现类可直接使用,也可重写)
        default void sayHi() {
            System.out.println("Hi!");
        }
        
        // 静态方法
        static void sayGoodbye() {
            System.out.println("Goodbye!");
        }
    }
    
    class MyGreeting implements Greeting {
        @Override
        public void sayHello() {
            System.out.println("Hello!");
        }
    }
    
    // 使用
    MyGreeting greeting = new MyGreeting();
    greeting.sayHello(); // 输出:Hello!
    greeting.sayHi(); // 输出:Hi!(直接使用接口默认方法)
    Greeting.sayGoodbye(); // 输出:Goodbye!(调用接口静态方法)
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27

    # 5. 其他实用改进

    • 日期时间 API:新增 java.time 包(LocalDate/LocalTime/LocalDateTime 等),替代了老旧的 Date/Calendar,解决了线程不安全、API 设计混乱的问题;
    • 方法引用:进一步简化 Lambda 表达式(如 String::toUpperCase 替代 s -> s.toUpperCase());
    • 性能优化:底层对 HashMap、ConcurrentHashMap 等集合做了优化,并行流利用 Fork/Join 框架提升处理效率。

    # 总结

    Java 8 最核心的优点可总结为 3 点:

    1. 代码更简洁:Lambda 表达式 + Stream API 大幅减少冗余代码,实现函数式编程风格;
    2. 更健壮:Optional 类有效避免空指针,接口默认方法提升代码扩展性;
    3. 更高效:Stream 并行处理、底层性能优化提升程序运行效率,新日期 API 解决旧 API 的痛点。

    上次更新: 12/30/2025
    在 MySQL 中,如何优化 ORDER BY 查询?
    集合与流有何不同?

    ← 在 MySQL 中,如何优化 ORDER BY 查询? 集合与流有何不同?→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式