Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法

简介: 【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。

Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。

流库(Stream API)

流库提供了一种声明性方式来处理集合数据,支持过滤、映射、聚合等多种操作。流操作可以分为中间操作和终端操作。中间操作返回一个新的流,允许多个操作链式调用;终端操作触发流的处理并返回结果。

1. Filter

filter 是一个中间操作,用于从流中筛选出符合条件的元素。它接收一个谓词(Predicate)作为参数,返回一个由满足谓词条件的元素组成的新流。

示例:过滤出所有的偶数

java复制代码

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FilterExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        List<Integer> evenNumbers = numbers.stream()
                                           .filter(n -> n % 2 == 0)
                                           .collect(Collectors.toList());

        System.out.println(evenNumbers); // 输出: [2, 4, 6, 8, 10]
    }
}

2. Map

map 是一个中间操作,用于将流中的每个元素应用一个函数,并将结果收集到一个新的流中。map 操作通常用于对象的转换和数据的提取。

示例:将字符串列表转换为其长度的列表

java复制代码

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MapExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("Java", "Stream", "API", "Filter", "Map");
        List<Integer> lengths = words.stream()
                                     .map(String::length)
                                     .collect(Collectors.toList());

        System.out.println(lengths); // 输出: [4, 6, 3, 6, 3]
    }
}

3. FlatMap

flatMap 是一个中间操作,与 map 类似,但它的映射函数会将每个元素转换为一个流,并将多个流合并成一个新的流。flatMap 常用于处理嵌套集合或多对多的映射关系。

示例:将单词列表拆分为字母列表

java复制代码

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("Java", "Stream", "API");
        List<String> letters = words.stream()
                                    .flatMap(word -> Arrays.stream(word.split("")))
                                    .collect(Collectors.toList());

        System.out.println(letters); // 输出: [J, a, v, a, S, t, r, e, a, m, A, P, I]
    }
}

Optional 类

Optional 类是 Java 8 引入的一个特殊容器类,用于表示可能为空的值,避免显式的空检查和 NullPointerException

1. 创建 Optional

你可以使用 Optional.ofOptional.ofNullableOptional.empty 方法创建一个 Optional 对象。

java复制代码

import java.util.Optional;

public class OptionalExample {
    public static void main(String[] args) {
        Optional<String> nonEmptyOptional = Optional.of("Hello");
        Optional<String> emptyOptional = Optional.empty();
        Optional<String> nullableOptional = Optional.ofNullable(null);

        System.out.println(nonEmptyOptional); // 输出: Optional[Hello]
        System.out.println(emptyOptional); // 输出: Optional.empty
        System.out.println(nullableOptional); // 输出: Optional.empty
    }
}

2. 使用 Optional

Optional 提供了多种方法来处理可能为空的值,包括 isPresentifPresentorElseorElseGetorElseThrow 等。

示例:使用 Optional 处理可能为空的值

java复制代码

import java.util.Optional;

public class OptionalUsageExample {
    public static void main(String[] args) {
        Optional<String> optionalValue = Optional.of("Hello");

        // 检查值是否存在
        if (optionalValue.isPresent()) {
            System.out.println(optionalValue.get()); // 输出: Hello
        }

        // 使用 ifPresent
        optionalValue.ifPresent(value -> System.out.println(value)); // 输出: Hello

        // 使用 orElse
        String defaultValue = optionalValue.orElse("Default Value");
        System.out.println(defaultValue); // 输出: Hello

        // 使用 orElseGet
        String valueFromSupplier = optionalValue.orElseGet(() -> "Value from Supplier");
        System.out.println(valueFromSupplier); // 输出: Hello

        // 使用 orElseThrow
        try {
            String valueOrException = optionalValue.orElseThrow(() -> new IllegalStateException("No value"));
            System.out.println(valueOrException); // 输出: Hello
        } catch (IllegalStateException e) {
            e.printStackTrace();
        }
    }
}

综合示例

下面是一个综合示例,展示了如何结合使用 Stream API 和 Optional 处理复杂的集合操作:

示例:处理嵌套的集合并处理空值

java复制代码

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

public class ComprehensiveExample {
    public static void main(String[] args) {
        List<List<String>> nestedList = Arrays.asList(
                Arrays.asList("Java", "Stream"),
                Arrays.asList("Optional", "Filter", null),
                Arrays.asList("FlatMap", "Map")
        );

        List<String> processedList = nestedList.stream()
                .flatMap(List::stream)
                .map(word -> Optional.ofNullable(word).orElse("Empty"))
                .filter(word -> !word.equals("Empty"))
                .collect(Collectors.toList());

        System.out.println(processedList); // 输出: [Java, Stream, Optional, Filter, FlatMap, Map]
    }
}

总结

Java 8 的流库和 Optional 类为我们提供了强大且简洁的工具,用于处理集合数据和空值。通过 filter、map、flatMap 等中间操作,结合 Optional 类的方法,我们可以轻松地进行数据转换、过滤和空值处理,从而提高代码的可读性和安全性。希望本文对你理解和使用这些重要特性有所帮助。

相关文章
|
5天前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
3月前
|
存储 人工智能 Java
Java 8 的 Optional:提高代码安全性与可读性
本文深入解析 Java 中的 `NullPointerException` 及其传统处理方式,并介绍了 Java 8 引入的 `Optional` 类。通过示例代码讲解了 `Optional` 的创建、使用及其 API,探讨了其在实际开发中的最佳实践与局限性,帮助开发者提升代码的健壮性与可读性。
Java 8 的 Optional:提高代码安全性与可读性
|
3月前
|
存储 缓存 NoSQL
java 集合入门基础理论的核心概念与实用长尾知识
本文介绍了Java集合框架的基础理论知识,包括单列集合(List、Set、Queue)和双列集合(Map)的特点及常用实现类(如ArrayList、HashSet、HashMap等)。详细讲解了集合的遍历方式(迭代器、增强for循环、Lambda表达式)和典型应用场景(如数据去重、键值存储等)。通过具体代码示例,帮助初学者理解集合框架的核心概念和实际应用,为Java编程中的数据存储与管理提供基础指导。
97 0
|
4月前
|
存储 安全 Java
2025 年最新 40 个 Java 基础核心知识点全面梳理一文掌握 Java 基础关键概念
本文系统梳理了Java编程的40个核心知识点,涵盖基础语法、面向对象、集合框架、异常处理、多线程、IO流、反射机制等关键领域。重点包括:JVM运行原理、基本数据类型、封装/继承/多态三大特性、集合类对比(ArrayList vs LinkedList、HashMap vs TreeMap)、异常分类及处理方式、线程创建与同步机制、IO流体系结构以及反射的应用场景。这些基础知识是Java开发的根基,掌握后能为后续框架学习和项目开发奠定坚实基础。文中还提供了代码资源获取方式,方便读者进一步实践学习。
862 2
|
4月前
|
分布式计算 Java 大数据
Java 语言基础概念与常识之主要特点解析
Java是一种广泛应用于企业级开发、移动应用(如Android)、大数据处理及云计算等领域的编程语言。其核心特点包括跨平台性(一次编写,到处运行)、面向对象设计、自动垃圾回收、多线程支持和高性能表现。Java通过JVM实现跨平台,具备强大的健壮性和安全性,同时拥有丰富的标准库与活跃的开发者社区。本文深入解析Java的技术优势及其在电商系统、大数据处理和云计算中的实际应用,并提供相关面试资料供学习参考。
125 0
|
6月前
|
存储 Java API
Java Optional 完全指南:彻底告别 NullPointerException
Java 8 引入的 `Optional` 类旨在解决 `null` 带来的空指针异常问题,通过提供容器类显式处理可能为空的值,提升代码健壮性和可读性。本文从基础到进阶解析 `Optional` 的用法,涵盖创建、检查、获取值、处理值等核心功能,结合实际应用场景与最佳实践,助你彻底告别 `NullPointerException`,编写更优雅的 Java 代码。
306 0
|
6月前
|
JavaScript 前端开发 开发者
flat、flatmap与map的用法区别
本文介绍了 JavaScript 数组方法 `flat()`、`flatMap()` 和 `map()` 的用法及区别。`flat()` 可按指定深度递归展平数组,参数为深度,默认一层;`flatMap()` 结合了 `map()` 和 `flat()` 功能,返回一维数组,长度可能不同于原数组;而 `map()` 返回与原数组长度一致的新数组。通过多个代码示例展示了三者的功能和差异,帮助开发者更好地理解和使用这些方法。
611 0
|
10月前
|
存储 Java 程序员
Java的基础概念一
### Java编程基础简介 #### 一、注释 注释用于解释代码,不会参与编译和运行。Java支持三种注释: - **单行注释**:以 `//` 开头。 - **多行注释**:以 `/* ... */` 包围。 - **文档注释**:通常用于生成开发文档。 #### 二、关键字 关键字是被Java赋予特定含义的英文单词,全部小写,且在代码编辑器中有特殊颜色标记。常用的如 `class` 表示定义一个类。
Java的基础概念一
|
9月前
|
缓存 Java 开发者
Java字面量详解:概念、分类与使用实例
本文介绍了Java字面量的概念、分类及应用。
276 11
|
9月前
|
Java 数据安全/隐私保护
Java的基础概念(二)
本文介绍了Java编程语言中的运算符和表达式,涵盖算术运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符等。重点讲解了算术运算符的使用,如加减乘除取余,并强调了整数除法和取余的特殊性。同时,详细说明了隐式转换与强制转换的概念及应用场景,以及字符串和字符的拼接规则。通过多个案例演示了不同运算符的实际应用,包括数值拆分、自增自减、三元表达式的使用等。最后简要提及了运算符的优先级,指出小括号具有最高优先级。