如何取出Map中的key和value--Map.Entry 类使用简介

本文介绍了一种更高效地遍历Java中Map的方法,通过使用Map.Entry类避免了多次get操作。此外,还提供了一个实用方法实现Hashtable的排序输出。

你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用Map.Entry类,你可以得到在同一时间得到所有的信息。标准的Map访问方法如下:

Set keys = map.keySet( );
if(keys != null) {
Iterator iterator = keys.iterator( );
while(iterator.hasNext( )) {
Object key = iterator.next( );
Object value = map.get(key);
;....
;}
}

然后,这个方法有一个问题。从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。


幸运的是,这里有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。 接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下:



Set entries = map.entrySet( );
if(entries != null) {
Iterator iterator = entries.iterator( );
while(iterator.hasNext( )) {
Map.Entry entry =iterator.next( );
Object key = entry.getKey( );
Object value = entry.getValue();

;....
}
}

尽管增加了一行代码,我们却省略了许多对Map不必要的“get”调用。同时,提供给开发人员一个同时保持了关键字和其对应的值的类。Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。

Hashtable内部排列的方式是散列排布,所以当输出信息时会是无序的。为了能保证输出的数据按照顺序排列,不要渴望用java自带的函数来对 Hashtable对象进行调整处理。当我们获取Hashtable里的KEY和VALUE时,一般都运行了Map.Entry类来转换,好,现在就用这 个类来作文章,我具体写了一个方法。

 

代码:

 

/**
* 方法名称:getSortedHashtable
* 参数:Hashtable h 引入被处理的散列表
* 描述:将引入的hashtable.entrySet进行排序,并返回
*/
public static Map.Entry[] getSortedHashtable(Hashtable h){

 

   Set set = h.entrySet();
  
   Map.Entry[] entries = (Map.Entry[])set.toArray(new Map.Entry[set.size()]);
   
   Arrays.sort(entries,new Comparator(){

 

    public int compare(Object arg0, Object arg1) {
     Object key1 = ((Map.Entry)arg0).getKey();
     Object key2 = ((Map.Entry)arg1).getKey();
     return ((Comparable)key1).compareTo(key2);
    }
   
   });
  
   return entries;
}

 

调用这个方法:

 

Map.Entry[] set = getSortedHashtable(t);
    
   //perportyTable
   for (int i=0;i<set.length;i++){

 

    System.out.println(set[i].getKey().toString());
   
     System.out.println(set[i].getValue().toString());

   }

<think>好的,用户问的是能不能把之前用XML配置的util:map换成用代码读入,但还能让XML中的其他Bean通过构造器注入。我需要先理解这个问题。 首先,用户提供的XML配置是一个util:map,里面定义了一个HashMap,键是字符串,值是特定的AppPayloadBuilder实例。这些entry的键使用了占位符,值是引用其他Bean。用户现在想用代码来替代这个XML配置,但又不影响其他Bean通过构造器注入这个Map。 接下来,我需要考虑如何用Java代码创建这个Map Bean,同时保持其可用性,供XML配置中的其他Bean注入。可能的解决方案包括使用@Configuration,结合@Bean方法,或者使用@Value注解来注入属性值。 然后,用户提到XML中的其他Bean需要通过构造器注入这个Map。在Java配置中,可以通过@Autowired或者构造器参数来实现。但用户可能希望保持XML中其他Bean的构造器注入不变,所以需要确保在Java代码中定义的Bean能够被XML正确引用。 另外,原XML中的entry使用value-ref,即引用其他Bean。在Java配置中,需要将这些Bean作为值放入Map中。可能需要通过@Qualifier或者直接注入这些Bean到配置中,再构建Map。 还需要处理占位符的键,即使用@Value或者Environment来获取属性值。这样,键的值仍然可以从属性文件中读取,保持灵活性。 可能的步骤是: 1. 创建一个@Configuration。 2. 在该中定义一个@Bean方法返回Map。 3. 使用@Autowired注入所需的AppPayloadBuilder实例。 4. 使用@Value注入属性值作为键。 5. 在XML中其他Bean的构造器注入中,引用这个新定义的Bean名称。 同时,要确保Java配置XML配置能够共存,并且Spring容器能正确管理所有Bean。需要检查Bean的作用域名称是否正确,避免冲突。 还要考虑用户可能的误解,比如是否完全迁移到Java配置,但用户希望保留部分XML配置,所以需要混合使用。这时候需要确认Bean的定义是否正确,是否在组件扫描的路径下,或者在XML中启用注解配置。 最后,需要提供一个清晰的示例代码,展示如何将XML中的Map转换为Java配置,并确保其他Bean可以通过构造器注入这个Map。同时,可能需要提到使用MapFactoryBean作为替代方案,如果用户想继续使用XML但避免硬编码。 </think>是的,**可以通过Java代码替代XML中的`<util:map>`配置**,同时保持该Map Bean的可用性供XML中其他Bean通过构造器注入。以下是具体实现方案: --- ### **1. 核心思路** - **使用`@Value`注入属性值**:替代XML中的`${}`占位符。 - **通过`@Autowired`注入Bean值**:替代XML中的`value-ref`引用。 - **定义`@Bean`方法创建Map**:在`@Configuration`中返回配置好的Map- **保持Bean名称一致**:确保XML中其他Bean仍可通过`ref="gcmNotificationMap"`注入。 --- ### **2. Java代码实现** ```java @Configuration public class NotificationConfig { // 注入属性值(键) @Value("${tapo.shareLauch.msg.type}") private String shareLaunchMsgType; @Value("${tapo.detect.smartTapoDeviceActivity.msg.type}") private String smartTapoDeviceActivityMsgType; @Value("${tapoFfsNewDeviceFound.msg.msg.type}") private String tapoFfsNewDeviceFoundMsgType; // 注入Bean值(引用其他Bean) @Autowired private AppPayloadBuilder tapoShareFcmNotificationBuilder; @Autowired private AppPayloadBuilder smartTapoDeviceActivityFcmNotificationBuilder; @Autowired private AppPayloadBuilder tapoFfsFcmNotificationBuilder; // 定义Bean并初始化Map @Bean(name = "gcmNotificationMap") public Map<String, AppPayloadBuilder> gcmNotificationMap() { Map<String, AppPayloadBuilder> map = new HashMap<>(); map.put(shareLaunchMsgType, tapoShareFcmNotificationBuilder); map.put(smartTapoDeviceActivityMsgType, smartTapoDeviceActivityFcmNotificationBuilder); map.put(tapoFfsNewDeviceFoundMsgType, tapoFfsFcmNotificationBuilder); return map; } } ``` --- ### **3. XML中其他Bean的注入方式** 在XML中,其他Bean仍可通过`ref="gcmNotificationMap"`注入该Map: ```xml <bean id="notificationService" class="com.example.NotificationService"> <constructor-arg ref="gcmNotificationMap"/> </bean> ``` --- ### **4. 关键点说明** - **Bean名称一致性**:`@Bean(name = "gcmNotificationMap")`确保Bean名称原XML配置一致。 - **属性Bean注入**:通过`@Value``@Autowired`实现动态值填充,避免硬编码。 - **混合配置兼容性**:Spring支持Java ConfigXML配置共存,无需完全迁移。 --- ### **5. 进阶方案:使用`MapFactoryBean`替代XML** 如果希望保留部分XML配置,但避免直接使用`<util:map>`,可以改用`MapFactoryBean`: ```xml <bean id="gcmNotificationMap" class="org.springframework.beans.factory.config.MapFactoryBean"> <property name="targetMapClass" value="java.util.HashMap"/> <property name="sourceMap"> <map key-type="java.lang.String" value-type="com.tplink.cloud.msgcenter.service.sender.payloadBuilder.AppPayloadBuilder"> <entry key="${tapo.shareLauch.msg.type}" value-ref="tapoShareFcmNotificationBuilder"/> <entry key="${tapo.detect.smartTapoDeviceActivity.msg.type}" value-ref="smartTapoDeviceActivityFcmNotificationBuilder"/> <entry key="${tapoFfsNewDeviceFound.msg.msg.type}" value-ref="tapoFfsFcmNotificationBuilder"/> </map> </property> </bean> ``` 此方式本质仍是XML配置,但更接近Java代码的逻辑。 --- ### **6. 优势注意事项** #### **优势** - **解耦配置XML**:通过Java代码集中管理配置逻辑。 - **型安全**:编译时检查属性名Bean引用。 - **灵活性**:可在代码中添加动态逻辑(如条件判断、默认值)。 #### **注意事项** - **属性文件加载**:确保`@Value`注入的属性已正确加载。 - **Bean作用域**:默认Bean是单例,符合Map的预期行为。 - **依赖顺序**:确保`AppPayloadBuilder`型的Bean已定义。 --- ### **总结** 通过Java代码替代XML中的`<util:map>`配置是完全可行的,且能保持原有XML注入方式的兼容性。推荐使用`@Configuration`结合`@Bean`方法实现,既能利用Java型安全优势,又能灵活管理动态值。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值