文档站点
Skip to content

常用工具与帮助函数 ​

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 且长度 > 0

String 常用 ​

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)    // sprintf

TIP

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 拷到 target

BeanUtils: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

Carbonjava.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/LaravelJava
判空empty($x)StringUtils.hasText(x)(字符串) / x == null
安全判等$a === $bObjects.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)

面向 PHP / Laravel 开发者的 Spring Boot 中文文档