刚入门Java时,我们总忙着敲 Hello World 、new对象、写循环,但想要从“能用”到“好用”,就得扒一扒那些藏在基础里的进阶小细节——今天聊几个不起眼但能让代码瞬间变优雅的知识点,新手也能秒懂~
一、告别if-else嵌套:用Optional拯救空指针
空指针(NullPointerException)堪称Java程序员的“噩梦”,以前我们总靠层层if判断防坑:
// 传统写法:又丑又容易漏
String userName = null;
if (user != null) {
UserInfo info = user.getInfo();
if (info != null) {
userName = info.getName();
}
}
userName = userName == null ? "匿名用户" : userName;
而Java 8的Optional能把嵌套变成链式调用,直接优雅兜底:
// Optional写法:一行搞定空值处理
String userName = Optional.ofNullable(user)
.map(User::getInfo)
.map(UserInfo::getName)
.orElse("匿名用户");
核心逻辑: ofNullable 包装可能为空的对象, map 安全取值, orElse 指定空值默认值,再也不用写一堆if判空!
二、循环的“天花板”:Stream流式处理
还在靠for循环遍历集合、筛选数据?Stream能把“遍历-筛选-处理”打包成一行代码,可读性直接拉满:
List<String> fruitList = Arrays.asList("apple", "banana", "cherry", "apple");
// 传统for循环:去重+筛选长度>5+转大写
Set<String> result = new HashSet<>();
for (String fruit : fruitList) {
if (fruit.length() > 5) {
result.add(fruit.toUpperCase());
}
}
// Stream写法:链式调用,逻辑一目了然
Set<String> streamResult = fruitList.stream()
.filter(f -> f.length() > 5)
.map(String::toUpperCase)
.collect(Collectors.toSet());
Stream不仅简洁,还支持并行处理( parallelStream() ),大数据量下效率直接起飞~
三、枚举的正确打开方式:别只当“常量容器”
很多人用枚举就定义几个常量,但枚举其实能加方法、实现接口,堪称“增强版常量”:
// 普通枚举:只能存值
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}
// 进阶枚举:带属性+方法,逻辑内聚
enum Season {
SPRING("春天", "春暖花开"),
SUMMER("夏天", "烈日炎炎"),
AUTUMN("秋天", "秋高气爽"),
WINTER("冬天", "白雪皑皑");
private final String name;
private final String desc;
// 构造方法(必须私有)
Season(String name, String desc) {
this.name = name;
this.desc = desc;
}
// 自定义方法
public String getDesc() {
return desc;
}
}
// 使用:直接调用方法,无需额外判断
System.out.println(Season.SPRING.getDesc()); // 输出:春暖花开
枚举的构造方法默认私有,不用担心被外部实例化,比静态常量更安全~