核心语言对象String、Math和Data对象

       在这里我们讨论一下JavaScript中的核心语言对象,包括String对象,Math对象和Date对象。
一、String对象

       字符串是放在一对引号中的文本,引号可以是双引号或单引号。这样就允许字符串互相嵌套:

        alert('You cannot lose.');     // alert()方法需要调用一个带引号的字符串作为参数

       如果带引号的表达式包含一个撇号,就应该将外面的引号改为双引号;如果在带引号的字符串中同时出现了撇号和引号,就需要使用转义字符。我们可以采用两种方法将字符串赋值给变量,分别为:

        var myString = "Howdy";

        var myString = new String("Howdy");

       关于两个字符串的连接,最关键在于使用"+"和"+="的两个操作符之一,定义并赋值给字符串对象,然后将需要连接的字符串用操作符连接起来即可。

       下面来介绍几种重要的字符串方法:

       改变字符串的大小写:我们可以采用两种方法将字符串转换为大写或小写:

        var result = string.toUpperCase();

        var result = string.toLowerCase();

       字符串搜索:使用String.indexof()方法来确定一个字符串是否包含在另一个字符串中。该方法返回一个数值,表示短字符串在长字符串中的起始下标值(从0开始)。如果短字符串不在长字符串中,其返回值为-1。为了判断短字符串是否在长字符串中只需要判断返回值是否为-1。这个方法设计一个长字符串和一个短字符串,长字符串位于方法名的左边,而短字符串是indexof()方法的参数。

       提取字符和子字符串的副本:可以使用charAt()方法从字符串的指定位置提取单个字符,这个方法的参数是要提取字符的下标(从0开始):

        var stringA = "Building C";

        var bidgLetter = stringA.charAt(9);      //结果应该为C

       如果知道要提取的字符串的起始位置,就可以使用两个类似的方法string.substr()和string.substring()提取连续几个字符,这两个方法的区别是string.substr()需要指定字符串的长度,而 string.substring()希望知道子字符串的终止位置:

        string.substr(startingPosition [, length]);

        string.substring(startingPosition [, endingPosition]);

       如果没有提供第二个参数(长度或终止位置),这两个方法都会提取直到原始字符串末尾的所有字符。被提取的字符串在引用中位于方法名的左边,起始和终止位置的参数是下标值(左边为开始,右边为结束)。

二、Math对象

       Math对象的属性是常数,比如圆周率pi和2的平方根:Math.PI、Math.SORT2。

       Math对象方法包括各种三角函数,可以利用Math对象确定两个数值中的较大者:Math.max(value1,value2);

       Math对象的方法也可以来生成随机数:Math.random()方法返回0和1之间的浮点数。

三、Data对象

       脚本浏览器包含一个全局的Date对象,这个对象总是存在,可以随时调用。处理日期时,比如显示当天的日期,需要调用Date对象的构造函数,获取一个与当天时间和日期相关联的Date对象实例。例如,调用这个构造函数的无参数版本:

        var today = new Date();

       Date对象实例的内部是时间,以毫秒为单位,从GMT时区(它是所有时间转换的世界标准参考点)的1970年1月1日0时开始计算,所以Date对象包含日期和时间信息。在Date对象的构造函数中,将过去或将来的某个日期和时间作为Date对象构造函数的参数,就可以得到该时刻的Date对象的快照(我们还可以设置日期格式):

        var somDate = new Date("Month dd,yyyy hh:mm:ss");

<think>我们有一个泛型类HKResponse<T>,其中data字段是T类型。但在分页场景中,T实际上是一个包含分页信息(如total, pageNo, pageSize, list)的对象。因此,我们需要调整HKResponse类的定义,使得data字段是一个包含分页数据的特定对象。 根据用户的需求,我们需要从HKResponse<T>中获取data对象的list其他参数(如total, pageNo, pageSize)。因此,我们需要在data字段中封装这些分页信息。 ### 步骤1:定义分页数据结构 首先,我们定义一个分页数据类,它包含总记录数、当前页码、每页大小数据列表。这个类也是泛型的,以便可以存放任意类型的数据列表。 ```java public class PageData<T> { private int total; // 总记录数 private int pageNo; // 当前页码 private int pageSize; // 每页大小 private List<T> list; // 当前页的数据列表 // 无参构造器 public PageData() { } // 全参构造器 public PageData(int total, int pageNo, int pageSize, List<T> list) { this.total = total; this.pageNo = pageNo; this.pageSize = pageSize; this.list = list; } // gettersetter方法 public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } public int getPageNo() { return pageNo; } public void setPageNo(int pageNo) { this.pageNo = pageNo; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } public List<T> getList() { return list; } public void setList(List<T> list) { this.list = list; } } ``` ### 步骤2:修改HKResponse类 然后,我们修改HKResponse类,使其data字段为PageData<T>类型。这样,我们就可以在data中获取分页信息。 ```java public class HKResponse<T> { private String code; // 返回码 private String msg; // 返回消息 private PageData<T> data; // 分页数据对象 private Long timestamp; // 时间戳 // 无参构造器 public HKResponse() { this.timestamp = System.currentTimeMillis(); } // 成功时的构造器,通常我们使用静态工厂方法创建成功响应 public HKResponse(PageData<T> data) { this.code = "0"; this.msg = "SUCCESS"; this.data = data; this.timestamp = System.currentTimeMillis(); } // 失败时的构造器 public HKResponse(String code, String msg) { this.code = code; this.msg = msg; this.timestamp = System.currentTimeMillis(); } // gettersetter方法 public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public PageData<T> getData() { return data; } public void setData(PageData<T> data) { this.data = data; } public Long getTimestamp() { return timestamp; } public void setTimestamp(Long timestamp) { this.timestamp = timestamp; } } ``` ### 步骤3:如何从HKResponse中获取数据 假设我们有一个返回用户列表的分页响应,我们可以这样使用: ```java // 假设我们有一个获取用户列表的方法,返回HKResponse<User> HKResponse<User> response = getUserList(); // 检查响应是否成功 if ("0".equals(response.getCode())) { // 获取分页数据对象 PageData<User> pageData = response.getData(); // 获取总记录数 int total = pageData.getTotal(); // 获取当前页码 int pageNo = pageData.getPageNo(); // 获取每页大小 int pageSize = pageData.getPageSize(); // 获取当前页的用户列表 List<User> userList = pageData.getList(); // 然后就可以使用userList了 for (User user : userList) { System.out.println(user); } } else { // 处理错误情况 System.err.println("Error: " + response.getMsg()); } ``` ### 步骤4:JSON解析示例 如果从网络或文件中获取到JSON字符串,我们需要将其解析为HKResponse对象。这里以Jackson为例: ```java import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; String json = "..."; // 从网络或文件获取的JSON字符串 ObjectMapper objectMapper = new ObjectMapper(); // 使用TypeReference来指定泛型类型 HKResponse<User> response = objectMapper.readValue(json, new TypeReference<HKResponse<User>>() {}); // 然后就可以按照步骤3的方式获取数据 ``` ### 说明 1. 我们通过引入`PageData<T>`类来封装分页信息,这样在`HKResponse<T>`中,`data`字段就是`PageData<T>`类型。 2. 当我们需要获取列表数据时,先通过`response.getData()`获取到`PageData`对象,然后通过`getList()`方法获取数据列表。 3. 同样,我们也可以获取分页的其他信息,如总记录数、当前页码、每页大小。 ### 相关问题 1. 如果分页数据结构在不同接口中不一致(例如字段名不同),如何设计通用的分页响应类? 2. 如何处理非分页的响应(即data字段不是分页结构)? 3. 在Spring Boot中如何统一封装分页响应?</think>### 从 `HKResponse<T>` 获取分页数据的完整指南 #### 1. 关键类结构定义 ```java // 泛型响应类 public class HKResponse<T> { private String code; // 状态码 private String msg; // 消息 private T data; // 泛型数据对象 private Long timestamp; // 时间戳 // Getter/Setter public T getData() { return data; } // 其他getter/setter... } // 分页数据包装类 public class PageData<T> { private int total; // 总记录数 private int pageNo; // 当前页码 private int pageSize; // 每页大小 private List<T> list; // 数据列表 // Getter/Setter public List<T> getList() { return list; } public int getTotal() { return total; } // 其他getter/setter... } ``` #### 2. 获取分页数据的三种方式 ##### 方式1:直接访问嵌套属性 ```java HKResponse<PageData<User>> response = getApiResponse(); // 获取分页元数据 int total = response.getData().getTotal(); int currentPage = response.getData().getPageNo(); // 获取数据列表 List<User> userList = response.getData().getList(); // 遍历列表 for (User user : userList) { System.out.println(user.getName()); } ``` ##### 方式2:类型安全方法(推荐) ```java public <T> PageData<T> extractPageData(HKResponse<PageData<T>> response) { if (!"0".equals(response.getCode())) { throw new RuntimeException("API错误: " + response.getMsg()); } return response.getData(); } // 使用示例 PageData<Product> pageData = extractPageData(productResponse); List<Product> products = pageData.getList(); System.out.println("总记录数: " + pageData.getTotal()); ``` ##### 方式3:JSON解析(使用Jackson) ```java ObjectMapper mapper = new ObjectMapper(); // 定义类型引用 TypeReference<HKResponse<PageData<Employee>>> typeRef = new TypeReference<HKResponse<PageData<Employee>>>() {}; // 解析JSON HKResponse<PageData<Employee>> response = mapper.readValue(json, typeRef); // 获取数据 List<Employee> employees = response.getData().getList(); ``` #### 3. 处理特殊场景 ##### 场景1:空数据安全处理 ```java List<User> safeList = Optional.ofNullable(response.getData()) .map(PageData::getList) .orElse(Collections.emptyList()); ``` ##### 场景2:分页元数据校验 ```java PageData<Order> pageData = response.getData(); if (pageData.getPageNo() > pageData.getTotal() / pageData.getPageSize()) { throw new IllegalStateException("页码超出范围"); } ``` ##### 场景3:Map结构数据处理(引用[3]) ```java HKResponse<PageData<Map<String, Object>>> mapResponse = ...; List<Map<String, Object>> dataList = mapResponse.getData().getList(); for (Map<String, Object> item : dataList) { System.out.println("ID: " + item.get("ID")); System.out.println("Name: " + item.get("NAME")); } ``` #### 4. 最佳实践建议 1. **空值防护**: ```java // 使用Java8 Optional防止NPE int pageSize = Optional.ofNullable(response.getData()) .map(PageData::getPageSize) .orElse(10); ``` 2. **类型安全验证**: ```java if (!(response.getData() instanceof PageData)) { throw new IllegalArgumentException("无效的分页数据结构"); } ``` 3. **分页元数据计算**: ```java // 计算总页数 int totalPages = (int) Math.ceil((double) pageData.getTotal() / pageData.getPageSize()); ``` 4. **响应状态检查**: ```java if (!"0".equals(response.getCode())) { // 处理错误逻辑 } ``` #### 5. 设计原理说明 此设计通过两层泛型封装实现: 1. `HKResponse<T>` 封装通用API响应 2. `PageData<T>` 封装分页数据结构 3. 嵌套泛型 `HKResponse<PageData<User>>` 确保: - 类型安全的数据访问 - 统一错误处理机制 - 分页元数据与业务数据分离 > 通过泛型参数化类型(ParameterizedType),在编译时保留类型信息,避免运行时类型转换错误[^2]。这种模式在Spring Data等框架中广泛使用,提供类型安全的API访问体验[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值