我正在尝试优化此代码。我能想到的唯一优化是在第二个if条件内,applyOfferChanges(...)之后的return或break语句。 有什么想法吗?
void applyFavoriteChangesToMerchantStore(){
List<Merchant> favoriteMerchantsList = FavoriteMerchantStore.getInstance().getFavoriteMerchantsList();
if(favoriteMerchantsList != null && !favoriteMerchantsList.isEmpty()) {
List<Merchant> storeMerchantList = MerchantStore.getInstance().getMerchantList();
for (Merchant storeMerchant : storeMerchantList) {
for (Merchant favoriteMerchant: favoriteMerchantsList){
if(TextUtils.equals(storeMerchant.getId(), favoriteMerchant.getId())){
//merchant match found
//set merchant favorite status
storeMerchant.setFavoriteMerchant(favoriteMerchant.getFavoriteMerchant());
//set offer favorite status
applyOfferChanges(favoriteMerchant.getOffferList(),
storeMerchant.getOffferList());
}
}
}
}
}
答案 0 :(得分:0)
这完全取决于您未向我们展示的内容。列表有多大,TextUtils.equals
到底是什么?假设是android.text.TextUtils
,答案很明确:使用两个O(m*n)
(复杂度HashMap
)代替两个嵌套循环(复杂度O(m+n)
)。
代替
for (Merchant storeMerchant : storeMerchantList) {
for (Merchant favoriteMerchant: favoriteMerchantsList) {
if(TextUtils.equals(storeMerchant.getId(), favoriteMerchant.getId())) {
....
}
做
Map<String, Merchant> favoriteMerchantMap = new HashMap<>();
for (Merchant favoriteMerchant : favoriteMerchantsList) {
favoriteMerchantMap.put(favoriteMerchant.getId(), favoriteMerchant));
}
for (Merchant storeMerchant : storeMerchantList) {
Merchant favoriteMerchant = favoriteMerchantMap.get(storeMerchant.getId());
if (favoriteMerchant != null) {
....
}
答案 1 :(得分:0)
我认为您可以使用java-8对此进行优化。
如果我没记错的话,如果无法再找到它们,则您的代码不会将收藏夹设置为null。
这应该与原始代码相同,但是采用的是Java-8方式:
无效applyFavoriteChangesToMerchantStore(){ //获取喜欢的商人列表 列出favoriteMerchantsList = FavoriteMerchantStore.getInstance()。getFavoriteMerchantsList();
// if any favorites found, we gotta do something with them
if(favoriteMerchantsList != null && !favoriteMerchantsList.isEmpty()) {
// take list of all merchants
List<Merchant> storeMerchantList = MerchantStore.getInstance().getMerchantList();
// convert those into a map with the ids as keys
Map<String, Merchant> storeMap = storeMerchantList.stream().collect(Collectors.toMap(Merchant::getId, merchant -> merchant));
// set the favorite for each merchant
favoriteMerchantsList.forEach(favoriteMerchant -> {
// if each favorite is guaranteed to be in the list of storeMerchantList, this causes no null result
Merchant storeMerchant = storeMap.get(favoriteMerchant.getId());
//set merchant favorite status
storeMerchant.setFavoriteMerchant(favoriteMerchant.getFavoriteMerchant());
//set offer favorite status
applyOfferChanges(favoriteMerchant.getOffferList(), storeMerchant.getOffferList());
});
}
}
如果您想重置(设置为null)当前与“我的收藏”不匹配的商家,则您的代码应如下所示:
无效applyFavoriteChangesToMerchantStore(){ //获取喜欢的商人列表 列出favoriteMerchantsList = FavoriteMerchantStore.getInstance()。getFavoriteMerchantsList();
Map<String, Merchant> favMap = null;
if(favoriteMerchantsList == null) {
// if no favorites found, creating an empty map
favMap = new HashMap<>();
} else {
// convert list into a map with the ids as keys
favMap = favoriteMerchantsList.stream().collect(Collectors.toMap(Merchant::getId, merchant -> merchant));
}
// take list of all merchants
List<Merchant> storeMerchantList = MerchantStore.getInstance().getMerchantList();
// set the favorite for each merchant
storeMerchantList.forEach(storeMerchant -> {
if (favMap.containsKey(storeMerchant.getId()))
{
// get the favorite
Merchant favoriteMerchant = favMap.get(storeMerchant.getId());
//set merchant favorite status
storeMerchant.setFavoriteMerchant(favoriteMerchant.getFavoriteMerchant());
//set offer favorite status
applyOfferChanges(favoriteMerchant.getOffferList(), storeMerchant.getOffferList());
} else {
//set merchant favorite status
storeMerchant.setFavoriteMerchant(null);
// cannot call applyOfferChanges, because no favoriteMerchant (or change this as you wish)
}
});
}
}
尽管没有任何测试,我希望他们能工作,如果有帮助,请随时做出答复。