我想知道如何使用 Map Data Structure 和 Lambdas 重構我的代碼。
這是我的方法:
private void validateUserFields(User user) {
if(user.getName() == null){
throw new RuntimeException("The user's name cannot be null");
}
if(user.getLastName() == null){
throw new RuntimeException("The user's lastName cannot be null");
}
if(user.getDni() == null){
throw new RuntimeException("The user's dni cannot be null");
}
if(user.getVehicle() == null){
throw new RuntimeException("The user's vehicle cannot be null");
}
}
我期待一種優雅且簡單的方式來重構我的代碼。
uj5u.com熱心網友回復:
嘗試驗證地圖:
private static Map<String, Function<User, ?>> VALIDATIONS = Map.of(
"name", User::getName,
"lastName", User::getLastName,
"dni", User::getDni,
"vehicle", User::getVehicle
);
private void validateUserFields(User user) {
VALIDATIONS.entrySet().stream()
.filter(entry -> entry.getValue().apply(user) == null)
.map(Map.Entry::getKey)
.map(field -> String.format("The user's %s cannot be null", field))
.map(RuntimeException::new)
.findFirst()
.ifPresent(e -> {
throw e;
});
}
我不知道它是否“優雅”,但它具有可擴展性和靈活性。
uj5u.com熱心網友回復:
這是您要求的,我不知道它是否優雅,您的方法對我來說看起來不錯,我唯一要更改的是創建一個 InvalidUserException ,它采用 null 欄位的名稱。
這對于理解資料結構和功能介面可能是一個很好的練習,但對于如此簡單的事情,我不會這樣做。
您可以使用 lambda 查看簡化的策略模式。
編輯:如果您在許多欄位上都有非常復雜的驗證邏輯,這可能很有用,但只是為了檢查沒有欄位為空,我同意使用評論中建議的 Lombok 方法。
public class App {
public static HashMap<String, Predicate<User>> VALIDATION_FUNCTIONS = new HashMap<>();
static {
VALIDATION_FUNCTIONS.put("NAME", user -> user.getName() != null);
VALIDATION_FUNCTIONS.put("MOREFIELDS", user -> user.getMorefields() != null);
}
public static void main(String[] args) {
validateUserFields(new User());
}
private static void validateUserFields(User user) {
VALIDATION_FUNCTIONS.forEach((field,function) -> {
if (!function.test(user)) {
throw new RuntimeException(field " is null");
}
}
);
}
@Getter
@NoArgsConstructor
static class User {
private String name;
private String morefields;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/525643.html
標籤:爪哇字典验证拉姆达哈希图
上一篇:使用函式將錯誤陳述句寫入字典
