Java @在两个列表中使用不同值排序
下面是我的要求和一个简单的例子:Java @在两个列表中使用不同值排序,java,spring,spring-boot,Java,Spring,Spring Boot,下面是我的要求和一个简单的例子: public interface Animal {} @Component @Order(1) public class Hippo implements Animal{} @Component @Order(2) public class Crocodile implements Animal{} 我想将它们以不同的顺序注入到两个列表中。例如,陆地动物应在第一个索引中包含河马,在第二个索引中包含鳄鱼,水生动物应在第一个索引中包含鳄鱼,在第二个索引中包含河
public interface Animal {}
@Component
@Order(1)
public class Hippo implements Animal{}
@Component
@Order(2)
public class Crocodile implements Animal{}
我想将它们以不同的顺序注入到两个列表中。例如,陆地动物
应在第一个索引中包含河马,在第二个索引中包含鳄鱼,水生动物
应在第一个索引中包含鳄鱼,在第二个索引中包含河马
@Autowired
private List<Animal> landAnimals; // 0-Hippo & 1-Crocodile (achieved with @Order)
@Autowired
private List<Animal> waterAnimals; // 0-Crocodile & 1-Hippo (not achieved)
@Autowired
私人名单陆生动物;//0-河马和1-鳄鱼(通过@Order实现)
@自动连线
私人名单水生动物;//0-鳄鱼和1-河马(未实现)
@订单,我们可以动态更改吗?您无法使用@Order
动态更改订单
注意:我认为您不需要创建两个不同的列表。注入单个列表,并在需要时相应地反转
您可以调用Collections.reverse()
,以根据您的需求反转列表
例如:
@Autowired
private List<Animal> landAnimals;
public void showOrderList() {
Collections.reverse(animals);
for (Animal animal : animals) {
// do some operation..
}
}
@Autowired
私人名单陆生动物;
public void showOrderList(){
收藏。反面(动物);
用于(动物:动物){
//做些手术。。
}
}
简单的方法是使用后构造
,您可以在其中更改顺序,如下所示
@PostConstruct
public void init() {
waterAnimals.sort(AnnotationAwareOrderComparator.INSTANCE.reversed());
}
将订单放入界面:
public interface Animal {
int getLandOrder();
int getWaterOrder();
}
创建一个提供不同排序列表的服务bean
@Service
public class AnimalService {
private final List<Animals> landAnimals;
private final List<Animals> waterAnimals;
// BTW, don't use field injection
public AnimalService(List<Animal> animals) {
// Create copies of the list, because they are sorted in place
landAnimals = new ArrayList<>(animals);
landAnimals.sort(Comparator.comparing(Animal::getLandOrder));
waterAnimals = new ArrayList<>(animals);
waterAnimals.sort(Comparator.comparing(Animal::getWaterOrder));
}
public List<Animal> getLandAnimals() {
return landAnimals;
}
public List<Animal> getWaterAnimals() {
return waterAnimals;
}
}
@服务
公共级动物服务{
私人土地动物最终名单;
私人最终水生动物名单;
//顺便说一句,不要使用现场注入
公共动物服务(列出动物){
//创建列表的副本,因为它们已按位置排序
陆地动物=新的ArrayList(动物);
陆地动物。排序(比较器。比较(动物::getLandOrder));
waterAnimals=新ArrayList(动物);
waterAnimals.sort(Comparator.comparing(Animal::getWaterOrder));
}
公共列表getLandAnimals(){
归还陆生动物;
}
公共列表getWaterAnimals(){
归还水生动物;
}
}
现在在需要列表的地方注入AnimalService
,并使用getter。@Hamid这有帮助吗?我需要将它们注入不同的bean中,因此这需要在框架级别处理。我能想到的解决方案是在“@”配置类中用“@”Bean显式地准备这些列表,然后注入它们。根据条件更改“@”订单值似乎不可能。反转可能无法完全解决此问题。将来我可能会有更多的豆子,而且顺序可能会改变。基本上,我需要更大的灵活性来定义顺序,这样将来我就不会被单一(包括反向)顺序所束缚。@Hamid您可以编写自己的比较器,只针对这种情况进行反向操作。注意:sort
修改列表(在本例中是单例bean),因此,任何其他使用列表/bean的组件都将具有相同的顺序。@如果您错了,其他使用此bean/列表顺序的组件不会改变,您可以尝试一下。您是说集合作为原型(每个请求的单独实例)而不是单例(所有请求的单个实例),这是默认的?你能给我看一下那方面的文件吗?