keyset可以再那些地方用
时间: 2024-03-31 10:36:39 浏览: 10
keySet()是Java Map接口中定义的一个方法,用于获取Map集合中所有key的集合。通过keySet()方法返回的Set集合,可以对Map中的键进行迭代、删除或查找操作。
除了Map接口中的实现类HashMap、LinkedHashMap、TreeMap等之外,ConcurrentHashMap类中也提供了keySet()方法。在ConcurrentHashMap中,keySet()方法返回一个ConcurrentHashMap.KeySetView对象,它是一个支持并发访问的Set集合,可以在多线程环境中安全地对Map中的键进行操作。
需要注意的是,如果对Map中的键进行了修改,对应的Set集合也会发生相应的变化。也就是说,如果从Set集合中删除了某个键,Map中对应的键值对也会被删除。因此在使用keySet()方法时,需要谨慎处理Map集合中的键值对,避免出现不必要的错误。
相关问题
ruoyi多数据源配置及使用
Ruoyi框架中多数据源配置和使用非常简单,下面是具体步骤:
1. 在 `application.yml` 中配置多个数据源信息,例如:
```
spring:
datasource:
# 主数据源配置
master:
url: jdbc:mysql://localhost:3306/db1
username: root
password: root
# 第二个数据源配置
slave:
url: jdbc:mysql://localhost:3306/db2
username: root
password: root
```
这里配置了两个数据源,一个是主数据源,另一个是名为 `slave` 的数据源。
2. 在 `DataSourceConfig` 类中配置多数据源,例如:
```java
@Configuration
public class DataSourceConfig {
@Bean(name = "masterDataSource")
@ConfigurationProperties(prefix = "spring.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "dynamicDataSource")
@Primary
public DataSource dynamicDataSource(@Qualifier("masterDataSource") DataSource masterDataSource,
@Qualifier("slaveDataSource") DataSource slaveDataSource) {
DynamicRoutingDataSource dynamicRoutingDataSource = new DynamicRoutingDataSource();
Map<Object, Object> dataSourceMap = new HashMap<>(2);
dataSourceMap.put(DataSourceType.MASTER.name(), masterDataSource);
dataSourceMap.put(DataSourceType.SLAVE.name(), slaveDataSource);
dynamicRoutingDataSource.setDefaultTargetDataSource(masterDataSource);
dynamicRoutingDataSource.setTargetDataSources(dataSourceMap);
DynamicDataSourceContextHolder.dataSourceKeys.addAll(dataSourceMap.keySet());
return dynamicRoutingDataSource;
}
}
```
在这里,我们定义了两个 `@Bean`,分别对应 `master` 和 `slave` 数据源,并且定义了一个 `DynamicRoutingDataSource` 对象,它是一个动态数据源,可以根据需要切换到不同的数据源。在 `dynamicDataSource` 方法中,我们将两个数据源添加到 `dataSourceMap` 中,并设置 `masterDataSource` 为默认的数据源。
3. 定义一个枚举类 `DataSourceType`,用于定义数据源的类型,例如:
```java
public enum DataSourceType {
MASTER,
SLAVE
}
```
4. 定义一个 `DynamicDataSourceContextHolder` 类,用于动态切换数据源,例如:
```java
public class DynamicDataSourceContextHolder {
public static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
public static Set<Object> dataSourceKeys = new HashSet<>();
public static void setDataSourceKey(String dataSourceKey) {
contextHolder.set(dataSourceKey);
}
public static String getDataSourceKey() {
return contextHolder.get();
}
public static void clearDataSourceKey() {
contextHolder.remove();
}
public static boolean containsDataSource(String dataSourceKey) {
return dataSourceKeys.contains(dataSourceKey);
}
}
```
`DynamicDataSourceContextHolder` 中使用了 `ThreadLocal` 来保存当前线程使用的数据源,可以在需要切换数据源的地方调用 `DynamicDataSourceContextHolder.setDataSourceKey(dataSourceKey)` 来切换数据源。另外,它还提供了 `dataSourceKeys` 属性,用于保存所有数据源的名称,方便进行判断和管理。
5. 在需要使用数据源的地方调用 `DynamicDataSourceContextHolder.setDataSourceKey(dataSourceKey)` 来切换数据源,例如:
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsers() {
DynamicDataSourceContextHolder.setDataSourceKey(DataSourceType.SLAVE.name());
List<User> userList = userMapper.selectUserList(new User());
DynamicDataSourceContextHolder.clearDataSourceKey();
return userList;
}
}
```
在这里,我们在调用 `userMapper.selectUserList` 之前,切换到 `SLAVE` 数据源,然后在查询完成之后,清除数据源的上下文。
这样,我们就可以在 Ruoyi 框架中配置和使用多个数据源了。
优化这段代码 vMap.put("tags", v.getTags().stream().map(TagDTO::mapping).collect(Collectors.toList())); v.getTags().forEach(t -> { if (t.getId() == 2 || t.getId() == 208) { vMap.put("earTag", t.getName()); } else if (t.getId() == 5) { vMap.put("iflytekTag", t.getName()); } }); if (valueByVersionMap.containsKey(v.getId())) { final Map<Integer, ValueEntity> valueMap = valueByVersionMap.get(v.getId()).stream() .collect(Collectors.toMap(ValueEntity::getPropertyId, value -> value)); valueMap.keySet().forEach(p -> { if (this.propertyMap.containsKey(p)) { final String value = this.getValue(valueMap.get(p).getVal(), this.propertyMap.get(p).getCategory()); if (StringUtils.isNotBlank(value)) { vMap.put(String.valueOf(p), value); } } if (p.equals(11)) { final String value = this.getValue(valueMap.get(p).getVal(), this.propertyMap.get(p).getCategory()); if (StringUtils.isNotBlank(value)) { vMap.put("license", value); } } }); }
这是给定的代码段:
```java
vMap.put("tags",
v.getTags().stream().map(TagDTO::mapping).collect(Collectors.toList()));
v.getTags().forEach(t -> {
if (t.getId() == 2 || t.getId() == 208) {
vMap.put("earTag", t.getName());
} else if (t.getId() == 5) {
vMap.put("iflytekTag", t.getName());
}
});
if (valueByVersionMap.containsKey(v.getId())) {
final Map<Integer, ValueEntity> valueMap = valueByVersionMap.get(v.getId()).stream()
.collect(Collectors.toMap(ValueEntity::getPropertyId, value -> value));
valueMap.keySet().forEach(p -> {
if (this.propertyMap.containsKey(p)) {
final String value = this.getValue(valueMap.get(p).getVal(),
this.propertyMap.get(p).getCategory());
if (StringUtils.isNotBlank(value)) {
vMap.put(String.valueOf(p), value);
}
}
if (p.equals(11)) {
final String value = this.getValue(valueMap.get(p).getVal(),
this.propertyMap.get(p).getCategory());
if (StringUtils.isNotBlank(value)) {
vMap.put("license", value);
}
}
});
}
```
为了优化这段代码,我们可以进行以下几个步骤:
1. 使用方法引用来简化 `v.getTags().stream().map(TagDTO::mapping)` 为 `v.getTags().stream().map(TagDTO::mapping)`。
2. 使用 `forEach` 循环替代多个 `if` 语句来处理 `tags`。
3. 将 `valueByVersionMap` 的值缓存到一个变量中,以提高性能。
4. 将 `valueMap.keySet().forEach` 替换为 `valueMap.forEach`,以简化代码。
以下是优化后的代码:
```java
vMap.put("tags",
v.getTags().stream().map(TagDTO::mapping).collect(Collectors.toList()));
v.getTags().forEach(t -> {
int id = t.getId();
String name = t.getName();
if (id == 2 || id == 208) {
vMap.put("earTag", name);
} else if (id == 5) {
vMap.put("iflytekTag", name);
}
});
if (valueByVersionMap.containsKey(v.getId())) {
Map<Integer, ValueEntity> valueMap = valueByVersionMap.get(v.getId()).stream()
.collect(Collectors.toMap(ValueEntity::getPropertyId, value -> value));
valueMap.forEach((p, value) -> {
if (propertyMap.containsKey(p)) {
String propertyCategory = propertyMap.get(p).getCategory();
String propertyValue = getValue(value.getVal(), propertyCategory);
if (StringUtils.isNotBlank(propertyValue)) {
vMap.put(String.valueOf(p), propertyValue);
}
}
if (p.equals(11)) {
String licenseValue = getValue(value.getVal(), propertyMap.get(p).getCategory());
if (StringUtils.isNotBlank(licenseValue)) {
vMap.put("license", licenseValue);
}
}
});
}
```
这样,代码就更简洁、可读性更高,并且在一些地方进行了性能优化。请注意,这只是一个基本的优化示例,具体的优化策略可能会因上下文而异。