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");
相关推荐
航Hang*16 小时前
Windows Server 配置与管理——第8章:配置Web服务器
运维·服务器·windows·学习·vmware
猫耳球团17 小时前
IDEA与Cursor跨平台协作指南
java·ide·intellij-idea
亚历克斯神17 小时前
Java 职业发展:2026 指南
java·spring·微服务
Elaine33617 小时前
【软件测试系统学习笔记:从理论基础到接口实战】
软件测试·笔记·学习·接口测试
xuhaoyu_cpp_java17 小时前
Maven学习(二)
java·经验分享·笔记·学习·maven
西门吹-禅17 小时前
java 微服务学习笔记
java·学习·微服务
小碗羊肉17 小时前
【从零开始学Java | 第三十五篇】IO流-字节流
java·开发语言
xiaomo224918 小时前
javaee-网络原理4
java·网络
Soari18 小时前
Ziggo-CaaS-Switch软件配置: undefined reference to pthread_create
java·开发语言·fpga开发·tsn·zynq·交换机配置
云烟成雨TD18 小时前
Spring AI Alibaba 1.x 系列【13】 检查点 (Checkpoint) 机制及各类持久化实现
java·人工智能·spring