java - 重构 Java 程序
问题描述
问题:我有一个数组中的房屋列表。我需要确保至少一份清单只包含有猫的房子,而至少一份清单只包含有狗的房子。一个列表应该只包含一种房屋(即没有混合大小写)。假设一个房子可以养一只猫或一只狗。
我尝试编写代码,但它看起来不太好,希望您在重构或改进设计方面提供帮助。
Boolean isListWithHouseAndCatExist = false;
Boolean isListWithHouseAndDogExist = false;
List<House>[] arrOfHouseList = getArrOfHouseList();
for(List<House> houseList : arrOfHouseList){
Boolean isHousesWithCat = true;
Boolean isHousesWithDog = true;
for(House house: houseList){
if(house.hasCat()){
isHousesWithDog = false;
}else{
isHousesWithCat = false;
}
}
if(!isHousesWithDog && ! isHousesWithCat){
return false; //This is mixed case. The list contains both of kind of houses
}
isListWithHouseAndCatExist=isHousesWithCat?true:isListWithHouseAndCatExist;
isListWithHouseAndDogExist=isHousesWithDog?true:isListWithHouseAndDogExist;
}
// Now to check that we have atleast one list with all House-Cat and atleast one list with all
// House-Dog
if(!isListWithHouseAndCatExist || !isListWithHouseAndDogExist){
return false;
}
return true;
如您所见,我必须使用四个布尔变量来验证条件。您能否帮助改进代码。
解决方案
如果您不想使用流并且只想迭代一次,则可以执行以下操作:
Boolean isListWithHouseAndCatExist = false;
Boolean isListWithHouseAndDogExist = false;
List<House>[] arrOfHouseList = getArrOfHouseList();
for(List<House> houseList : arrOfHouseList){
Set<Boolean> hasCatFlags = new HashSet<>();
for(House house: houseList){
hasCatFlags.add(house.hasCat());
}
if(hasCatFlags.size() > 1){
return false; //This is mixed case. The list contains both of kind of houses
}
if (hasCatFlags.contains(true)) {
isListWithHouseAndCatExist = true;
} else if (hasCatFlags.contains(false)) {
isListWithHouseAndDogExist = true;
}
}
return isListWithHouseAndCatExist && isListWithHouseAndDogExist;
如果您可以使用流但只想迭代一次,则可以执行以下操作:
Boolean isListWithHouseAndCatExist = false;
Boolean isListWithHouseAndDogExist = false;
List<House>[] arrOfHouseList = getArrOfHouseList();
for(List<House> houseList : arrOfHouseList){
Set<Boolean> hasCatFlags = houseList.stream().map(House::hasCat).collect(Collectors.toSet());
if(hasCatFlags.size() > 1){
return false; //This is mixed case. The list contains both of kind of houses
}
if (hasCatFlags.contains(true)) {
isListWithHouseAndCatExist = true;
} else if (hasCatFlags.contains(false)) {
isListWithHouseAndDogExist = true;
}
}
return isListWithHouseAndCatExist && isListWithHouseAndDogExist;
如果你可以使用流并且不介意迭代两次,你可以这样做:
Boolean isListWithHouseAndCatExist = false;
Boolean isListWithHouseAndDogExist = false;
for(List<House> houseList : getArrOfHouseList()){
if (houseList.stream().allMatch(House::hasCat)) {
isListWithHouseAndCatExist = true;
} else if (houseList.stream().noneMatch(House::hasCat)) {
isListWithHouseAndDogExist = true;
} else {
return false;//mixed case
}
}
return isListWithHouseAndCatExist && isListWithHouseAndDogExist;
推荐阅读
- javascript - 拒绝访问跨域对象上的属性“文档”的权限
- php - 如何去除水印?
- eclipse - 我可以使用哪些工具和日志来找出 Eclipse 中的服务器无法启动的原因
- java - 仅限公共访问约束的注释
- angular - 在ngrx Effect 中的switchmap(api call) 之后访问一个action payload
- sql - 如何组合2个表的部分数据?
- php - 根据配置数组选择方法
- javascript - 我可以在 React 头盔标签中使用 react-i18next 反式标签吗?
- reactjs - npx create-react-app 没有进一步进行并停止在“使用 cra-template 安装 react、react-dom 和 react-scripts
- python - 如果与搜索值匹配,如何点击搜索引擎结果