【JavaDemo】使用Entry遍历含自定义类的Map集合

含有自定义类的Map遍历 Demo2


  • 此Demo演示方法2:获取键值对对象Entry,然后用Entry分别键获取键和值。
  • Map含有自定义类Singer。

自定义类Singer

//歌手类
public class Singer {
private String name;
private String songName;
public Singer(String name, String songName) {
    super();
    this.name = name;
    this.songName = songName;
}
public Singer() {
    super();
    // TODO Auto-generated constructor stub
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public String getSongName() {
    return songName;
}
public void setSongName(String songName) {
    this.songName = songName;
}
@Override
public String toString() {
    return "Singer [name=" + name + ", songName=" + songName + "]";
}


}

遍历类MapDemo2

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/*
 * 使用Map遍历自定义类型
 *      遍历方式:方法2,取出Map中所有的键值对对象Entry,根据Entry对象获取key和value。
 */
public class MapDemo2 {

    public static void main(String[] args) {

        //定义Singer对象
        Singer s1 = new Singer("田馥甄","小幸运");
        Singer s2 = new Singer("孙燕姿","天黑黑");
        Singer s3 = new Singer("周杰伦","晴天");
        Singer s4 = new Singer("不   才","你有没有见过他");

        //定义一个Map
        Map<String,Singer> map = new HashMap<>();

        //将Singer对象添加到Map中
        map.put("001", s1);
        map.put("002", s2);
        map.put("003", s3);
        map.put("004", s4);

        //获取Entry对象
        Set<Entry<String, Singer>> entrySet = map.entrySet();

        //打印标题
        System.out.println("\t\t"+"编号"+"\t\t"+"姓名"+"\t\t\t\t"+"歌曲");

        //遍历每个Entry对象,通过Entry对象获取对应的歌手姓名和歌曲名称
        for (Entry<String, Singer> entry : entrySet) {

            System.out.println("\t\t"+entry.getKey()+"\t\t"+entry.getValue().getName()+"\t\t"+entry.getValue().getSongName());
        }

    }

}
<think> 首先,用户的问题是:“我想查找在Spring Boot中对入参遍历指定map节点的方法 请问Spring Boot中如何遍历入参里指定的map节点”。我需要回顾之前的上下文。 从系统级指令看,用户提供了一些引用,但关键部分是用户的问题。引用[1]是关于在Thymeleaf中使用th:each遍历数组、List、Map的控制器示例。引用[2]是关于读取Excel转换为List或Map的工具类。 用户的问题集中在Spring Boot中遍历入参里指定的map节点。入参可能指的是HTTP请求中的参数,比如在控制器方法中的参数。 在Spring Boot中,控制器方法可以接收各种参数,包括Map类型。例如,使用@RequestParam或@PathVariable来接收参数。 用户的引用[1]中有一个例子:在UserController中,有一个方法userList(Model model),它创建了一个userList(List<User>),并添加到model中用于视图渲染。但这主要是后端处理,不是直接处理入参。 用户可能指的是在控制器方法中接收一个Map作为参数,然后遍历其中的特定节点。 常见场景: - 在Spring MVC控制器中,可以使用@RequestParam Map<String, String> params来接收所有查询参数。 - 或者使用@RequestBody接收一个JSON对象,映射为一个Map。 用户提到了“入参”,所以可能是在请求参数中传递的一个map。 在引用[1]中,没有直接处理入参的map;它是后端生成的map用于视图。 引用[2]是关于读取Excel的,不直接相关。 用户说:“上述引用仅供参考,并不是用户真正的需求”,所以我应该基于用户的问题来回答。 核心问题:如何遍历入参里指定的map节点。 在Spring Boot中: 1. 接收Map参数:使用@RequestParam或@RequestBody。 - 例如,@RequestParam Map<String, String> requestParams,这会接收所有查询参数作为map。 - 或者,如果请求体是JSON,可以使用@RequestBody Map<String, Object> body。 2. 遍历指定的map节点:用户说“指定的map节点”,可能意味着遍历map中的某个特定键对应的值,或者是遍历整个map。 用户说“指定的map节点”,可能是遍历map中的entry。 或者,用户可能想提取map中的某个键值对。 在遍历方面,可以使用Java的迭代方式遍历Map。 例如,在控制器方法中: ```java @RequestMapping("/somePath") public ResponseEntity<?> handleRequest(@RequestParam Map<String, String> params) { // 遍历整个map for (Map.Entry<String, String> entry : params.entrySet()) { String key = entry.getKey(); String value = entry.getValue(); // 处理每个键值对 } // 或者,如果用户想访问特定的节点,比如键为"node"的值 if (params.containsKey("node")) { String nodeValue = params.get("node"); // 处理nodeValue } return ResponseEntity.ok("Success"); } ``` 如果用户指的是在Thymeleaf视图中遍历map,如引用[1]所示。 引用[1]中,在控制器中,它将userList添加到model,然后在视图中使用th:each遍历。 用户的问题是“对入参遍历”,所以更可能是在控制器中处理入参,而不是视图。 用户说“入参遍历指定map节点”,可能意味着在控制器中接收map参数并遍历。 在Spring Boot中,入参通常通过方法参数注入。 另一个常见方式:使用@ModelAttribute或@RequestBody。 为了具体回答: - 步骤1:在控制器方法中定义参数来接收map。 例如: ```java @PostMapping("/processMap") public String processMap(@RequestParam Map<String, String> params, Model model) { // 遍历params for (Map.Entry<String, String> entry : params.entrySet()) { // 访问键和值 } // 或者访问特定键 String specificNode = params.get("specificKey"); if (specificNode != null) { // 处理 } return "viewName"; } ``` 如果map是嵌套的或在JSON中,可能需要使用@RequestBody。 示例: ```java @PostMapping("/processJson") public ResponseEntity<?> processJson(@RequestBody Map<String, Object> requestBody) { // 遍历整个map for (Map.Entry<String, Object> entry : requestBody.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // 检查值是否为map,如果是,可以进一步遍历 if (value instanceof Map) { Map<String, Object> subMap = (Map<String, Object>) value; for (Map.Entry<String, Object> subEntry : subMap.entrySet()) { // 遍历map } } } return ResponseEntity.ok("Processed"); } ``` 用户提到“指定的map节点”,可能意味着要遍历某个特定键下的子map。 所以,代码中可以提取特定节点的map遍历。 例如: ```java String nodeKey = "userData"; // 假设这是指定的节点键 if (requestBody.containsKey(nodeKey) && requestBody.get(nodeKey) instanceof Map) { Map<String, Object> specifiedMap = (Map<String, Object>) requestBody.get(nodeKey); for (Map.Entry<String, Object> entry : specifiedMap.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); // 处理每个条目 } } ``` 在回答中,我需要: - 使用中文。 - 结构清晰,逐步解决问题。 - 根据指令,添加引用标识如果引用文本。用户提供的引用[1]和[^2],但它们似乎不完全相关,特别是引用[2]是关于Excel的。我应该基于用户的问题回答。 用户说“参考站内引用”,但指定“上述引用仅供参考,并不是用户真正的需求”,所以我可以专注于核心问题。 在结束时,生成相关问题,如指令所示。 指令说:“生成相关问题”,在示例中是“§§相关问题§§”。 所以,我需要生成几个相关问题。 现在,构建回答: 1. 解释如何在Spring Boot控制器中接收map参数。 2. 展示如何遍历整个map或指定的map节点。 3. 提供代码示例。 4. 确保使用中文。 代码示例使用Markdown格式,如指令中的示例。 指令说:“所有行内数学表达式...”,但这里没有数学,所以忽略。 对于代码块,使用```。 回答结构: - 介绍方法。 - 给出代码示例。 - 可能解释选项。 - 结束相关问题。 相关问题示例: 1. 如何在Thymeleaf中遍历map? 2. 如何接收JSON请求体作为map? 3. 如何验证和处理map参数? 现在,书写回答。 </think> 在Spring Boot中,遍历入参里指定的Map节点通常是指在控制器方法中接收请求参数(如查询参数、表单数据或JSON请求体)作为Map对象,然后提取并遍历Map中特定键(节点)的子Map。这可以通过Spring MVC的注解(如`@RequestParam`、`@RequestBody`)实现,并结合Java的Map迭代机制。下面我将逐步解释方法,并提供代码示例。 ### 步骤1: 接收Map参数 在控制器方法中,使用Spring注解注入Map参数: - **查询参数或表单数据**: 使用`@RequestParam Map<String, String>`接收所有键值对。 - **JSON请求体**: 使用`@RequestBody Map<String, Object>`接收嵌套结构(例如JSON对象)。 - **指定节点**: 通过键提取Map中的子Map进行遍历。 ### 步骤2: 遍历指定Map节点 1. **检查Map中是否存在指定节点键**。 2. **验证值是否为Map类型**(防止类型转换错误)。 3. **遍历MapentrySet**,处理每个键值对。 ### 完整代码示例 以下是一个Spring Boot控制器方法的示例,演示如何接收请求参数、提取指定Map节点并遍历。示例假设入参是一个JSON请求体,其中包一个名为`data`的Map节点(例如用户查询`{ "data": { "key1": "value1", "key2": "value2" } }`)。 ```java package com.example.demo.controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.util.Map; @RestController public class MapController { /** * 处理POST请求,遍历入参中指定的Map节点 * @param requestBody 请求体映射为Map<String, Object> * @return 处理结果消息 */ @PostMapping("/traverseMap") public String traverseSpecifiedMapNode(@RequestBody Map<String, Object> requestBody) { // 步骤1: 指定要遍历Map节点键(例如"data") String specifiedNodeKey = "data"; // 步骤2: 检查节点是否存在且为Map类型 if (requestBody.containsKey(specifiedNodeKey) && requestBody.get(specifiedNodeKey) instanceof Map) { // 提取子Map并强制类型转换 Map<String, Object> specifiedMap = (Map<String, Object>) requestBody.get(specifiedNodeKey); // 步骤3: 遍历Map的每个entry StringBuilder result = new StringBuilder("遍历'data'节点结果: "); for (Map.Entry<String, Object> entry : specifiedMap.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); result.append(String.format("键: %s, 值: %s; ", key, value)); // 这里可以添加自定义处理逻辑,例如保存到数据库或验证值 } return result.toString(); } else { return "错误: 指定的Map节点不存在或不是Map类型"; } } } ``` ### 关键点解释 - **接收参数**: 使用`@RequestBody Map<String, Object>`处理JSON请求体。如果是GET请求的查询参数,改用`@RequestParam Map<String, String>`(但查询参数通常不支持嵌套Map,这时推荐使用DTO对象或JSON)。 - **遍历逻辑**: - `entrySet()`方法获取键值对集合,适合遍历所有条目。 - 通过`containsKey`和`instanceof`确保类型安全,避免`ClassCastException`。 - 示例中遍历了键为`"data"`的节点,您可以根据需求替换键名(如`"user"`或`"config"`)。 - **异常处理**: 添加了节点不存在时的错误处理,实际应用中可扩展为日志记录或返回错误响应。 - **数据类型**: 如果值本身是嵌套Map,可以递归遍历(示例中值类型为`Object`,需进一步检查)。 ### 适用场景 - **REST API开发**: 当客户端发送JSON数据时,提取特定字段下的Map。 - **表单处理**: 如果表单数据包Map结构(需前端配合),可类似处理。 - **集成视图层**: 结合Thymeleaf时,数据可通过`Model`传递到视图层遍历[^1],但本示例聚焦控制器层入参处理。 ### 注意事项 - **类型安全**: 使用泛型(如`Map<String, String>`)减少类型错误,或改用Spring的`@ModelAttribute`绑定到POJO对象。 - **性能**: 对大Map遍历时,考虑时间复杂度(O(n)),避免在循环中执行重操作。 - **安全**: 验证键值,防止注入攻击(如用户输入恶意键名)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值