
本教程探讨如何利用Java 8的Stream API和Optional特性,将传统命令式循环中的条件数据更新和集合元素过滤逻辑进行现代化重构。我们将详细展示如何通过`forEach`结合`Optional.ifPresent()`处理条件赋值,以及如何高效使用`removeIf`进行集合元素的删除,从而提升代码的简洁性与可读性。
在Java 8之前,处理集合中的元素通常依赖于传统的for或foreach循环。以下是一个典型的示例方法,它负责根据外部数据源更新集合中对象的属性,并移除特定条件的元素:
private Item getItemManufacturerPriceCodes(Item item) {
List<ItemPriceCode> itemPriceCodes = item.getItemPriceCodes();
// 遍历并根据条件更新ItemPriceCode的属性
for (ItemPriceCode ipc : itemPriceCodes) {
Optional<ManufacturerPriceCodes> mpc = manufacturerPriceCodesRepository
.findByManufacturerIDAndPriceCodeAndRecordDeleted(item.getManufacturerID(), ipc.getPriceCode(), NOT_DELETED);
if (mpc.isPresent()) {
ipc.setManufacturerPriceCode(mpc.get().getName());
}
}
// 移除满足特定条件的ItemPriceCode
item.getItemPriceCodes()
.removeIf(ipc -> DELETED.equals(ipc.getRecordDeleted()));
return item;
}这段代码的功能包括:
这种命令式风格的代码虽然功能明确,但在处理复杂逻辑时可能显得冗长,且Java 8引入的Stream API提供了更简洁、声明式的替代方案。
立即学习“Java免费学习笔记(深入)”;
Java 8的Stream API旨在提供一种声明式处理数据集合的方式,它允许我们以更简洁、更具表达力的方式执行过滤、映射、排序等操作。
在重构上述代码时,我们需要理解几个关键概念:
我们将分两步重构原始代码中的两个主要逻辑块。
原始代码中的for循环用于遍历itemPriceCodes,并根据条件查询数据库后更新ItemPriceCode的属性。我们可以使用Stream.forEach()结合Optional.ifPresent()来替代这个循环。
旧代码片段:
for (ItemPriceCode ipc : itemPriceCodes) {
Optional<ManufacturerPriceCodes> mpc = manufacturerPriceCodesRepository
.findByManufacturerIDAndPriceCodeAndRecordDeleted(item.getManufacturerID(), ipc.getPriceCode(), NOT_DELETED);
if (mpc.isPresent()) {
ipc.setManufacturerPriceCode(mpc.get().getName());
}
}Java 8 重构:
item.getItemPriceCodes().forEach(ipc -> {
// 执行数据库查询,返回Optional<ManufacturerPriceCodes>
manufacturerPriceCodesRepository
.findByManufacturerIDAndPriceCodeAndRecordDeleted(item.getManufacturerID(), ipc.getPriceCode(), NOT_DELETED)
// 如果Optional中存在值,则执行setManufacturerPriceCode操作
.ifPresent(mpc -> ipc.setManufacturerPriceCode(mpc.getName()));
});在这个重构中:
原始代码的第二部分是使用removeIf方法移除满足特定条件的元素。值得注意的是,removeIf方法本身就是Java 8引入的,它已经是一种非常现代和高效的集合操作方式。
旧代码片段:
item.getItemPriceCodes()
.removeIf(ipc -> DELETED.equals(ipc.getRecordDeleted()));Java 8 重构:
此部分代码无需额外重构,因为它已经完全符合Java 8的风格。
item.getItemPriceCodes()
.removeIf(ipc -> DELETED.equals(ipc.getRecordDeleted()));将上述两部分重构整合到一起,最终的方法将变得更加简洁和声明式:
import java.util.List;
import java.util.Optional;
// 假设 Item, ItemPriceCode, ManufacturerPriceCodes, ManufacturerPriceCodesRepository, NOT_DELETED, DELETED 已经定义
public class ItemService {
private ManufacturerPriceCodesRepository manufacturerPriceCodesRepository; // 注入或实例化
// 构造函数或setter用于注入repository
public ItemService(ManufacturerPriceCodesRepository manufacturerPriceCodesRepository) {
this.manufacturerPriceCodesRepository = manufacturerPriceCodesRepository;
}
private Item getItemManufacturerPriceCodes(Item item) {
// 1. 重构条件数据更新逻辑
item.getItemPriceCodes().forEach(ipc -> {
manufacturerPriceCodesRepository
.findByManufacturerIDAndPriceCodeAndRecordDeleted(item.getManufacturerID(), ipc.getPriceCode(), NOT_DELETED)
.ifPresent(mpc -> ipc.setManufacturerPriceCode(mpc.getName()));
});
// 2. 重构集合元素过滤逻辑 (已是Java 8风格)
item.getItemPriceCodes()
.removeIf(ipc -> DELETED.equals(ipc.getRecordDeleted()));
return item;
}
// 假设的实体和Repository接口
static class Item {
private String manufacturerID;
private List<ItemPriceCode> itemPriceCodes;
public Item(String manufacturerID, List<ItemPriceCode> itemPriceCodes) {
this.manufacturerID = manufacturerID;
this.itemPriceCodes = itemPriceCodes;
}
public String getManufacturerID() { return manufacturerID; }
public List<ItemPriceCode> getItemPriceCodes() { return itemPriceCodes; }
}
static class ItemPriceCode {
private String priceCode;
private String manufacturerPriceCode;
private String recordDeleted; // DELETED or NOT_DELETED
public ItemPriceCode(String priceCode, String recordDeleted) {
this.priceCode = priceCode;
this.recordDeleted = recordDeleted;
}
public String getPriceCode() { return priceCode; }
public String getManufacturerPriceCode() { return manufacturerPriceCode; }
public void setManufacturerPriceCode(String manufacturerPriceCode) { this.manufacturerPriceCode = manufacturerPriceCode; }
public String getRecordDeleted() { return recordDeleted; }
}
static class ManufacturerPriceCodes {
private String name;
public ManufacturerPriceCodes(String name) { this.name = name; }
public String getName() { return name; }
}
interface ManufacturerPriceCodesRepository {
Optional<ManufacturerPriceCodes> findByManufacturerIDAndPriceCodeAndRecordDeleted(String manufacturerID, String priceCode, String recordStatus);
}
// 假设的常量
static final String NOT_DELETED = "N";
static final String DELETED = "Y";
}通过本教程,我们学习了如何利用Java 8的Stream API和Optional特性,将传统的命令式for循环和条件逻辑重构为更简洁、声明式的代码。特别是使用forEach结合Optional.ifPresent()处理集合元素的条件更新,以及利用removeIf高效过滤集合,都显著提升了代码的可读性和维护性。在实际应用中,还需注意数据库查询等操作可能带来的性能影响,并采取相应的优化策略。
以上就是使用Java 8 Stream API重构集合操作:条件更新与元素过滤的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号