首页 > 解决方案 > 如何在旅途中重新索引列表?

问题描述

我的目标是创建一个像 Spring Framework 这样的依赖注入框架。现在我正在尝试List<Object> filteredServices基于Class<?>[] parameterTypes

services -> filtered services based on parameterTypes of a constructor.

我做了什么:

  1. 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;
  }

标签: java

解决方案


推荐阅读