常用工具与帮助函数
Laravel 有一堆全局帮助函数(
collect()、Str::、Arr::、optional());Java 没有全局函数,但有两个静态工具大类和一套流式 API。掌握它们,写 Java 就像用 PHP 内置函数一样顺手。
Java 原生工具类
Objects / StringUtils:判空、判等
java
import java.util.Objects;
import org.springframework.util.StringUtils; // Spring 自带,非标准库
Objects.isNull(x) // x == null
Objects.nonNull(x) // x != null
Objects.equals(a, b) // 安全的 equals,防 NPE
StringUtils.hasText(s) // 非 null 且去空格后非空(PHP: !empty($s))
StringUtils.hasLength(s) // 非 null 且长度 > 0String 常用
java
"Hello World".toLowerCase() // strtolower
"hello".toUpperCase() // strtoupper
" abc ".trim() // trim
"a,b,c".split(",") // explode
String.join(",", "a", "b", "c") // implode
"abc".startsWith("a") // str_starts_with
"abc".contains("b") // str_contains
"abc".replace("b", "X") // str_replace
String.format("%s-%d", "id", 1) // sprintfTIP
Java 的 String 是不可变的,所有方法都返回新字符串(PHP 的字符串函数也是返回值式,思维一致)。
Optional:优雅处理「可能为 null」
对应 Laravel 的 optional() 和「可空返回类型」:
java
Optional<String> maybe = Optional.ofNullable(user != null ? user.getName() : null);
maybe.isPresent() // 是否有值
maybe.orElse("默认值") // 无值给默认
maybe.orElseThrow(() -> new RuntimeException("没找到")) // 无值抛异常
maybe.ifPresent(name -> log.info(name)); // 有值才执行最佳实践:能用 Optional 就别到处 if null:
java
// 不好
String name = user != null ? user.getName() : "匿名";
// 好
String name = Optional.ofNullable(user).map(User::getName).orElse("匿名");Stream 流:Java 的集合函数式操作
这是 PHP 开发者最需要适应、也最实用的 Java 特性。对应 Laravel collect() 的链式操作:
过滤 + 收集
java
// PHP: collect($users)->filter(fn($u) => $u->isActive())->values()
List<User> activeUsers = users.stream()
.filter(User::isActive) // 过滤
.toList(); // 收集成 List映射
java
// PHP: collect($users)->pluck('name')
List<String> names = users.stream()
.map(User::getName) // 提取字段
.toList();排序
java
List<User> sorted = users.stream()
.sorted(Comparator.comparing(User::getCreatedAt).reversed())
.toList();查找
java
users.stream()
.filter(u -> u.getId() > 10)
.findFirst() // 返回 Optional,配合 orElse
.orElse(null);
boolean anyAdult = users.stream().anyMatch(u -> u.getAge() >= 18); // 类似 some()
long count = users.stream().count(); // 类似 count()汇总
java
int totalAge = users.stream().mapToInt(User::getAge).sum();
double avg = users.stream().mapToInt(User::getAge).average().orElse(0);记住公式
Java 的链式操作:collection → .stream() → 一连串操作 → .toList() / .collect(...) 收尾。就像 Laravel 的 collect($arr)->filter()->map()->values()。
Spring 自带工具
Spring 框架带了几个非常常用的工具类,不需要额外依赖:
java
import org.springframework.util.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
// 字符串
StringUtils.hasText(str)
StringUtils.hasLength(str)
StringUtils.capitalize("name") // "Name"
// Bean 属性拷贝(很常用!)
BeanUtils.copyProperties(source, target); // 把同名属性从 source 拷到 targetBeanUtils:DTO 转换利器
PHP 里你可以 collect($user)->only([...]);Java 里把实体转 DTO 经常用 BeanUtils.copyProperties:
java
Post post = repository.findById(id).orElseThrow(...);
PostDto dto = new PostDto();
BeanUtils.copyProperties(post, dto); // 同名属性自动拷贝TIP
BeanUtils.copyProperties 只拷同名属性,源没有的字段目标保持原样。实体→DTO 转换用它 + @JsonProperty 改名,比手写一个个 set 高效得多。这是 Java 的「偷懒利器」,但注意别用它复制到无关字段。
时间处理:java.time
PHP 用 Carbon;Java 用 java.time 包,比老的 java.util.Date 好用得多:
java
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
LocalDate.now() // 今天
LocalDateTime.now().plusDays(7) // 7 天后(Carbon::now()->addDays(7))
LocalDateTime.now().minusHours(2) // 2 小时前
LocalDateTime.now().isAfter(other) // 比较
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
.format(LocalDateTime.now()) // 格式化
// 解析
LocalDate.parse("2026-08-03")TIP
| Carbon | java.time |
|---|---|
Carbon::now() | LocalDateTime.now() |
->addDays(7) | .plusDays(7) |
->format('Y-m-d') | DateTimeFormatter.ofPattern("yyyy-MM-dd") |
->diffInDays() | ChronoUnit.DAYS.between(a, b) |
Carbon::parse('2026-08-03') | LocalDate.parse("2026-08-03") |
对照速查总表
| 需求 | PHP/Laravel | Java |
|---|---|---|
| 判空 | empty($x) | StringUtils.hasText(x)(字符串) / x == null |
| 安全判等 | $a === $b | Objects.equals(a, b) |
| 展开字符串 | explode(',', $s) | s.split(",") |
| 拼接字符串 | implode(',', $arr) | String.join(",", arr) |
| 集合过滤 | collect($arr)->filter() | arr.stream().filter(p).toList() |
| 提取字段 | ->pluck('name') | arr.stream().map(Fn::getName).toList() |
| 可空处理 | optional($x) | Optional.ofNullable(x) |
| 属性拷贝 | $request->all() 等 | BeanUtils.copyProperties(src, dst) |
| 当前时间 | Carbon::now() | LocalDateTime.now() |
| 时间加天 | ->addDays(7) | .plusDays(7) |