java打卡学习2:Stream高级与Optional

Stream 高级操作

Stream API 提供了丰富的中间操作和终端操作,用于处理集合数据。以下是一些高级用法:

过滤与映射

java 复制代码
list.stream()
    .filter(e -> e.getAge() > 18)  // 过滤年龄大于18的元素
    .map(Person::getName)          // 转换为姓名列表
    .collect(Collectors.toList());

扁平化处理

java 复制代码
List<List<String>> nestedList = ...;
nestedList.stream()
          .flatMap(Collection::stream)  // 扁平化为单一流
          .distinct()                   // 去重
          .forEach(System.out::println);

分组与分区

java 复制代码
Map<String, List<Person>> byCity = 
    people.stream()
          .collect(Collectors.groupingBy(Person::getCity));

Map<Boolean, List<Person>> partitioned = 
    people.stream()
          .collect(Collectors.partitioningBy(p -> p.getAge() > 30));

Optional 深度用法

Optional 用于避免空指针异常,提供更优雅的null处理方式。

创建Optional

java 复制代码
Optional<String> emptyOpt = Optional.empty();
Optional<String> ofOpt = Optional.of("value");  // 值不能为null
Optional<String> nullableOpt = Optional.ofNullable(nullableValue);

链式操作

java 复制代码
String result = Optional.ofNullable(user)
    .map(User::getAddress)
    .map(Address::getStreet)
    .orElse("default street");

条件处理

java 复制代码
optionalValue.ifPresent(v -> System.out.println("Found: " + v));

optionalValue.orElseThrow(() -> new RuntimeException("Value not present"));

结合Stream使用

java 复制代码
List<String> names = users.stream()
    .map(User::getName)
    .flatMap(Optional::stream)  // Java9+ 自动解包
    .collect(Collectors.toList());

性能注意事项

  • 避免在循环中创建Stream
  • 优先使用基本类型特化流(IntStream等)
  • 并行流仅在数据量大且无状态操作时使用

collect收集器

Collectors是Java 8中StreamAPI的核心工具类,用于将流中的元素聚合为集合或其他形式的结果。常用方法包括:

  • toList()/toSet():转换为List或Set

    java 复制代码
    List<String> list = stream.collect(Collectors.toList());
  • toMap():转换为Map,需指定键和值的提取函数

    java 复制代码
    Map<Integer, String> map = stream.collect(Collectors.toMap(Person::getId, Person::getName));
  • groupingBy():按条件分组

    java 复制代码
    Map<String, List<Person>> group = stream.collect(Collectors.groupingBy(Person::getDepartment));
  • joining():拼接字符串

    java 复制代码
    String joined = stream.collect(Collectors.joining(", "));

方法引用

方法引用是Lambda表达式的简写形式,通过::符号引用已有方法。分为四种类型:

  1. 静态方法引用

    java 复制代码
    Function<String, Integer> parser = Integer::parseInt;
  2. 实例方法引用

    java 复制代码
    List<String> list = Arrays.asList("A", "B");
    list.forEach(System.out::println);
  3. 对象方法引用

    java 复制代码
    String str = "test";
    Supplier<Integer> lengthSupplier = str::length;
  4. 构造方法引用

    java 复制代码
    Supplier<List<String>> listSupplier = ArrayList::new;

Optional空值处理

Optional用于避免NullPointerException,提供链式空值检查。核心方法:

  • ofNullable():包装可能为null的值

    java 复制代码
    Optional<String> opt = Optional.ofNullable(getNullableString());
  • orElse():提供默认值

    java 复制代码
    String value = opt.orElse("default");
  • orElseGet():延迟计算默认值

    java 复制代码
    String value = opt.orElseGet(() -> computeFallback());
  • map()flatMap():链式转换

    java 复制代码
    Optional<Integer> length = opt.map(String::length);

今日练习

分组统计的实现方法

使用SQL进行分组统计时,GROUP BY子句是关键。例如统计每个部门的员工数量:

sql 复制代码
SELECT department, COUNT(*) as employee_count 
FROM employees 
GROUP BY department;

在Java中利用Stream API进行分组统计:

java 复制代码
Map<String, Long> countByDepartment = employees.stream()
    .collect(Collectors.groupingBy(Employee::getDepartment, Collectors.counting()));

空指针优化的处理策略

Java中Optional类可以优雅处理空指针:

java 复制代码
Optional.ofNullable(obj)
    .map(Object::toString)
    .orElse("default");

使用Objects工具类进行空校验:

java 复制代码
String value = Objects.requireNonNullElse(input, "default");

数据库查询的空值处理

SQL中使用COALESCE函数处理空值:

sql 复制代码
SELECT COALESCE(column_name, 'N/A') FROM table;

MySQL的IFNULL函数:

sql 复制代码
SELECT IFNULL(column_name, 0) FROM table;

前端空值展示优化

JavaScript可选链操作符:

javascript 复制代码
const name = user?.profile?.name ?? 'Anonymous';

Vue/React中使用条件渲染:

jsx 复制代码
{user && <Profile data={user.profile} />}

日志记录中的空指针防护

日志输出前进行空校验:

java 复制代码
log.debug("User info: {}", Optional.ofNullable(user).map(User::toString).orElse("[null]"));

使用String.format时添加防护:

java 复制代码
String.format("Value: %s", obj != null ? obj : "null");
相关推荐
我命由我123456 小时前
Android Studio - Android Studio 自定义预览尺寸
android·java·ide·java-ee·android studio·android-studio·android runtime
咖啡八杯7 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
AIGS0017 小时前
企业AI落地的关键认知:向量空间JBoltAI的本体语义平台
java·人工智能·人工智能ai大模型应用
小职boy7 小时前
不忘初心Windows系统工具箱下载 - 系统优化与维护工具(v1.1)
windows·系统·电脑软件·工具箱
KaMeidebaby8 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
心中有国也有家8 小时前
AtomGit Flutter 鸿蒙客户端: ChangeNotifier 模式
学习·flutter·华为·harmonyos
取地址符9 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
Mininglamp_27189 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native
醉城夜风~9 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
贾斯汀frank10 小时前
C# 15 类型系统改进:Union Types
开发语言·windows·c#