java - 如何在旅途中重新索引列表?
问题描述
我的目标是创建一个像 Spring Framework 这样的依赖注入框架。现在我正在尝试List<Object> filteredServices
基于Class<?>[] parameterTypes
services -> filtered services based on parameterTypes of a constructor.
我做了什么:
- 我
Stream
用来过滤。
public List<Object> getObjectsFromConstructorParameterTypes(Class<?>[] parameterTypes, List<Object> objects) {
return objects
.stream()
.filter(object -> {
for (Class<?> parameterType : parameterTypes) {
if (parameterType.isAssignableFrom(object.getClass())) {
return true;
}
}
return false;
})
.collect(Collectors.toList());
}
示例参数类型和对象。
List<Object> services = new ArrayList<>();
services.add(IntegerServiceImpl.class.getConstructors()[0].newInstance());
services.add(BooleanServiceImpl.class.getConstructors()[0].newInstance());
getObjectsFromConstructorParameterTypes(HelloController.class.getConstructors()[0].getParameterTypes(),services);
@RestController
public class HelloController {
@Autowired
private final IntegerService integerService;
@Autowired
private final BooleanService booleanService;
public HelloController(IntegerService integerService, BooleanService booleanService) {
this.integerService = integerService;
this.booleanService = booleanService;
}
@GetMapping
public String getHello() {
return String.format("Hello %d %b", integerService.getRandomInt(), booleanService.getRandomBoolean());
}
}
public class BooleanServiceImpl implements BooleanService {
private final Random random = new Random();
public boolean getRandomBoolean() {
return random.nextBoolean();
}
}
@Service
public class IntegerServiceImpl implements IntegerService {
private final Random random = new Random();
public int getRandomInt() {
return random.nextInt();
}
}
我的预期结果:有重新索引的方法。例如[serviceB, serviceA]
_[serviceA, serviceB]
我的实际结果:我找不到方法。
相关问题:是否Stream
比嵌套For Each
和初始化的组合更好new ArrayList<>()
?我的意思是,当我们调用方法时,底层技术Stream
不会初始化新对象collect()
,因此人们更喜欢Stream
还是有其他原因?
public List<Object> getObjectsFromConstructorParameterTypes(Class<?>[] parameterTypes, List<Object> objects) throws Exception {
List<Object> results = new ArrayList<>();
for (Class<?> parameterType : parameterTypes) {
for (Object object : objects) {
if (parameterType.isAssignableFrom(object.getClass())) {
results.add(object);
break;
}
}
}
if (results.size() != parameterTypes.length) {
for (int i = 0; i < parameterTypes.length; i++) {
if (!objects.get(i).getClass().isAssignableFrom(parameterTypes[i])) {
throw new Exception(parameterTypes[i].getName() + " object has not been initialized.");
}
}
}
return results;
}
解决方案
推荐阅读
- codenameone - Codenameone:如何在 Android 上访问日历
- javascript - 如何创建一个后端来隐藏 Reactjs 应用程序中的 API 密钥?
- java - 我的程序没有显示代码?
- python - 如何将多维数组字符串转换回 Python 中的数组?
- entity-framework - 在 EF Core 中处理 DbUpdateConcurrencyException
- plotly - 如何在 plotly 上根据 pandas DF 列分配离散标记颜色?
- c++ - 使用 QVBoxLayout 或 QListWidgetItem 会导致 DLL 内的 QApplication::exec() 出现“访问冲突”异常
- git - 如何使用 `git log` 获得有意义的修订图
- npm - 突然 gulp 命令在 spfx 解决方案中无法识别
- python - 如何使用 while 循环每月将值增加 5%?