目前,我們一些與查詢相關的 API 和控制器是:
[GET] api/study-group?sortby=latest
[GET] api/study-group?sortby=star
[GET] api/study-group?sortby=level
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/study-group")
public class StudyGroupController {
private final StudyGroupService studyGroupService;
@GetMapping
public ResponseEntity<List<StudyGroupResponseDTO>> findStudyGroup(
@RequestParam(name = "sortby", defaultValue = "createdat") String sortBy) {
studyGroupService.findAll(sortBy);
......
}
}
它處理控制器的邏輯,但我想知道哪種方法更適合排序方法的分支處理。
第一種方法是通過if陳述句進行分支處理。
@Service
@RequiredArgsConstructor
public class StudyGroupService {
public List<StudyGroupResponseDTO> findAll(String sortBy) {
if(sortBy.equals("star") {
searchStudyOrderByStar()l
}else if(sortBy.equals("...")) {
....
}else {
...
}
}
private List<StudyGroupResponseDTO> sort(Function<StudyGroup, Comparable> function) {
return studyGroupRepository
.findAll()
.stream()
.sorted(Comparator.comparing(function, Comparator.reverseOrder())
.thenComparing(StudyGroup::getSeason, Comparator.reverseOrder()))
.map(studyGroupMapper::toResponseDTO)
.collect(Collectors.toList());
}
private List<StudyGroupResponseDTO> searchStudyOrderByCreatedAt() {
return sort(studyJournalService::searchLatestJournalCreatedAt);
}
private List<StudyGroupResponseDTO> searchStudyOrderByStar()
return sort(studyGroup -> studyGroup.getJournals().size());
}
private List<StudyGroupResponseDTO> searchStudyOrderByLike() {
return sort(StudyGroup::getLike);
}
}
當然,我也在考慮用 Enum 代替 String。但是,即使改變了,用 if 陳述句設定分支似乎也沒有改變。
另一種思考方式是使用 Map。
@Service
@RequiredArgsConstructor
public class StudyGroupService {
private final Map<String, Function<StudyGroup, Comparable> sortMap;
public List<StudyGroupResponseDTO> findAll(String sortBy) {
sortMap.get(sortBy);
....
}
}
你認為哪種方法看起來最好?
或者有比上面列出的更好的方法嗎?
如果您有任何好的意見,我們將非常感謝您的反饋!
uj5u.com熱心網友回復:
您可以使用 SpringGetMapping.params()指定要為某些請求引數值呼叫的映射,以完全擺脫if-else構造。
它是 的別名RequestMapping.params()。
映射請求的引數,縮小主映射。適用于任何環境的相同格式:一系列
"myParam=myValue"樣式運算式,僅在發現每個此類引數具有給定值時才映射請求。
然后您需要為引數的每個可能值定義額外的映射,spring 將根據sortby.
@GetMapping(params = "sortby=latest")
public ResponseEntity<List<StudyGroupResponseDTO>> findStudyGroupSortByLatest() {
//logic for sort by latest
}
@GetMapping(params = "sortby=star")
public ResponseEntity<List<StudyGroupResponseDTO>> findStudyGroupSortByStar() {
//logic for sort by star
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511702.html
標籤:爪哇春天弹簧MVC重构层
