第一: 檢驗,報錯直接丟擲異常: Objects.requireNonNull(contactId);
第二:方法名,檢查是否需要輸出日誌: if(printLogIfNeeded) //對於sql查詢方法、java中的方法名字的命名定義推薦: find..By/query..By/get..By
// 業務檢驗需要返回的code,這裡返回異常,用全域性異常捕獲再返回給前端
CustomerBuPO customerBu = Optional.ofNullable(foundationRepository.getBuByName(reqVO.getBuId()))
.orElseThrow(() -> new BusinessException(101, "buId not exist"));
第三:三個欄位都不為null的情況下執行的程式碼; 3個物件都匹配不到;
if (List.of("a", "b", "c").stream().allMatch(Objects::nonNull)) { System.out.println("3個物件都不為空"); } /** 簡化判斷: 2個物件是否不等於4*/ if (Stream.of(1, 2).noneMatch(x -> x == 4)) { System.out.println("a=4"); } /** 簡化判斷: a 物件既不等於 b 物件,也不等於 c 物件*/ if (Stream.of("b", "c").noneMatch("a"::equals)) { System.out.println("==a"); }
第四:其中有2個條件任一匹配到:
if(Stream.of(InProgress, Queued).anyMatch(status -> Objects.equals(source.getStatusCd(), status))){ }
或者:if(Arrays.asList(dailyLimit, monthLimit).contains(type)){}
或者:StringUtils.equalsAny(a,b,c) //只要有一個不為空
第五:如果為null值,但是要轉換欄位型別取值,都可以用這種方法:
CustomerLoyTxnStg loyTxnStg = new CustomerLoyTxnStg(); loyTxnStg.setOrigPoints(Optional.ofNullable(source.getOrigPoints()).map(BigDecimal::valueOf).orElse(null));
或者:
memTier.setSeqNum(Objects.requireNonNullElse(tier, Tier::new).getSeqNum());
或者:
String birthDay = StringUtils.defaultIfEmpty(contact.getCustomBirthdayDay(), "1");
或者:
1. 判斷為null給預設值:
String pointValue = posReqVO.getAccount1000Value() == null? "0":posReqVO.getAccount1000Value();
String pointValue = Optional.ofNullable(posReqVO.getAccount1000Value()).orElse("0");
第六:這是一種常見的 JSON 解析操作,它會嘗試獲取指定欄位的值,如果該欄位不存在或為 null,則返回空字串 ""。
String segmentNo = json.optString("SegmentNo")
String partnerFlag = customerJson.opt("PartnerFlag");
JSONObject jsonObject = customer.optJSONObject("Segments");
第七:jdk9及其以上:ifPresentOrElse() 的新方法。沒有用jdk9,但是jdk8這樣也能實現:
Optional.ofNullable(memberSegment)
.map(existingSegment -> {
CustomerLoyMemberSegmentPO updateSegmentPO = initMemberSegmentPO(memberCard, partnerCardDefnPO)
.setEndDate(null).setLastUpdated(DateUtils.utcNow());
memberSegmentRepository.updateSegmentByIdAndSegNum(updateSegmentPO);
return existingSegment;
})
.orElseGet(() -> {
memberSegmentRepository.insert(memberSegmentPO);
return null;
});
第八:最佳化 if else,不想用if else,也可以考慮用函式式斷言Predicate或BiPredicate 校驗。
1:用三元運算和 Consumer 改造: Consumer<List<CustomerLoyOrderTxnPO>> insertOperation = posConfirmPointVO.getIsRepeatedOrderFlag() ? orderTxnRepository::signleInsertLoyCustomerTxnOrder : orderTxnRepository::batchInsertLoyCustomerTxnOrder; insertOperation.accept(orderTxnsList); 2:使用三元運算子,最簡單實現。 3:用Predicate檢驗改造: // 判斷是否重複訂單的條件 Predicate<PosConfirmPointVO> isRepeatedOrder = PosConfirmPointVO::getIsRepeatedOrderFlag; // 定義處理重複訂單的邏輯 Runnable handleRepeatedOrder = () -> checkInsertCustomerBueventTxn(bueventTxnPO, account, buEventAccountDefnXmPOS); // 定義處理非重複訂單的邏輯 Runnable handleNonRepeatedOrder = () -> { customerBueventTxnRepository.insertCustomerBueventTxn(bueventTxnPO); upsertBueventAccountByType(memberId, eventId, account, buEventAccountDefnXmPOS); }; // 根據訂單是否重複執行不同的邏輯1 if (isRepeatedOrder.test(posConfirmPointVO)) { handleRepeatedOrder.run(); } else { handleNonRepeatedOrder.run(); } // 根據訂單是否重複執行不同的邏輯2 Optional.of(posConfirmPointVO) .filter(isRepeatedOrder) .ifPresentOrElse( result -> handleRepeatedOrder.run(), () -> handleNonRepeatedOrder.run() );
第九:用jdk8 最佳化舊程式碼:
1. 舊程式碼:
String authToken = getAuthToken();
updateApolloConfig(count, authToken, apolloServiceConfig.parseItemUrl());
if (isUpdateBlue) {
updateApolloConfig(count, authToken, apolloServiceConfig.parseBlueItemUrl());
}
這樣不更好:
Stream.of(apolloServiceConfig.parseItemUrl(),
isUpdateBlue ? apolloServiceConfig.parseBlueItemUrl() : Stream.empty())
.forEach(url -> updateApolloConfig(count, getAuthToken(), url));
2. 舊程式碼,包含判斷資料不為空:
List<Account> accounts = posConfirmReqVO.getAccounts();
if (accounts.isEmpty()) {
return;
}
accounts.stream()
.filter(acc -> "1000".equals(acc.getId()))
.findFirst()
.ifPresent(x -> posConfirmReqVO.setAccount1000Value(x.getEarnValue()));
這樣更好:
Optional.ofNullable(posConfirmReqVO.getAccounts())
.filter(accounts -> !accounts.isEmpty())
.flatMap(accounts -> accounts.stream()
.filter(acc -> "1000".equals(acc.getId()))
.findFirst())
.ifPresent(x -> posConfirmReqVO.setAccount1000Value(x.getEarnValue()));