001package com.ericlam.mc.eld.configurations; 002 003 004import javax.annotation.Nullable; 005import java.nio.file.Path; 006import java.util.function.Predicate; 007 008/** 009 * 分頁請求 010 */ 011public class PageRequest { 012 013 /** 014 * 特定數量的指定頁數請求 015 * 016 * @param page 頁數 (必須從 0 開始) 017 * @param size 數量 018 * @return 頁數請求 019 */ 020 public static PageRequest of(int page, int size) { 021 return new PageRequest(page, size); 022 } 023 024 025 /** 026 * 特定數量特定排序的指定頁數請求 027 * 028 * @param page 頁數 (必須從 0 開始) 029 * @param size 數量 030 * @param filter 文件路徑過濾 031 * @return 頁數請求 032 */ 033 public static PageRequest of(int page, int size, Predicate<Path> filter) { 034 return new PageRequest(page, size, filter); 035 } 036 037 private final int page; 038 private final int size; 039 private final Predicate<Path> filter; 040 041 /** 042 * 特定數量的指定頁數請求 043 * 044 * @param page 頁數 (必須從 0 開始) 045 * @param size 數量 046 */ 047 public PageRequest(int page, int size) { 048 this(page, size, null); 049 } 050 051 /** 052 * 特定數量特定排序的指定頁數請求 053 * 054 * @param page 頁數 (必須從 0 開始) 055 * @param size 數量 056 * @param filter 文件路徑過濾 057 */ 058 public PageRequest(int page, int size, @Nullable Predicate<Path> filter) { 059 this.page = page; 060 this.size = size; 061 this.filter = filter; 062 } 063 064 /** 065 * 獲取頁面請求的頁面數 066 * 067 * @return 頁面數 068 */ 069 public int getPage() { 070 return page; 071 } 072 073 /** 074 * 獲取每頁數量 075 * 076 * @return 數量 077 */ 078 public int getSize() { 079 return size; 080 } 081 082 /** 083 * 獲取路徑過濾 084 * 085 * @return 自定義過濾 086 */ 087 @Nullable 088 public Predicate<Path> getFilter() { 089 return filter; 090 } 091 092 /** 093 * 獲取下一頁的頁面請求 094 * 095 * @return 頁面請求 096 */ 097 public PageRequest next() { 098 return this.withPage(page + 1); 099 } 100 101 /** 102 * 獲取指定頁數的新頁面請求 103 * 104 * @param page 新頁數 105 * @return 頁面請求 106 */ 107 public PageRequest withPage(int page) { 108 return PageRequest.of(page, size, filter); 109 } 110 111 /** 112 * 獲取上一頁或第一頁的頁面請求 113 * 114 * @return 頁面請求 115 */ 116 public PageRequest previousOrFirst() { 117 return this.withPage(Math.max(0, page - 1)); 118 } 119 120}