是否有可能以优雅的方式重构下面的if/else部分?请分享您的专业知识和反馈.
if(onlineAreaPrioList.contains("ladies")){
dominantOnlineArea = "ladies";
}else if(onlineAreaPrioList.contains("kids")){
dominantOnlineArea = "kids";
}else if(onlineAreaPrioList.contains("men")){
dominantOnlineArea = "men";
}else if(onlineAreaPrioList.contains("home")){
dominantOnlineArea = "home";
}
Run Code Online (Sandbox Code Playgroud)
注意:优先顺序=女士>儿童>男士>家庭
输出:hashmap中的值:{men = 2,ladies = 2,home = 2,kids = 1}
onlineAreaPrioList中的值:[男人,女士,家]
ComputedOnlineArea:女士们
以下是整个代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import dto.ProductDTO;
public class Test {
static Map<String, Integer> freq = new HashMap<String, Integer>();
public static void main(String[] args) {
List<ProductDTO> recentlyBoughtList = recentlyBought();
List<ProductDTO> recentlyViewedList = recentlyViewed();
String finalOnlineArea = getDominantOnlineArea(recentlyViewedList,recentlyBoughtList);
System.out.println("ComputedOnlineArea: "+finalOnlineArea);
}
private static String getDominantOnlineArea(List<ProductDTO> recentlyViewedList,List<ProductDTO> recentlyBoughtList) {
for (ProductDTO productDTO: recentlyViewedList) {
countPrimaryOnlineArea(productDTO);
addSecondaryOnlineAreaWithPrimary(productDTO);
}
for (ProductDTO productDTO: recentlyBoughtList) {
countPrimaryOnlineArea(productDTO);
addSecondaryOnlineAreaWithPrimary(productDTO);
}
System.out.println("values in hashmap :"+freq);
return getOnlineAreaBasedOnDefaultPriorityOrder();
}
private static String getOnlineAreaBasedOnDefaultPriorityOrder() {
String dominantOnlineArea = null;
Set<String> onlineAreaPrioList = new HashSet<String>();
int maxValueInMap=(Collections.max(freq.values()));
for (Entry<String, Integer> entry : freq.entrySet()) {
if (entry.getValue()==maxValueInMap) {
//System.out.println(entry.getKey());
onlineAreaPrioList.add(entry.getKey());
}
}
System.out.println("values in onlineAreaPrioList :"+onlineAreaPrioList);
if(onlineAreaPrioList.contains("ladies")){
dominantOnlineArea = "ladies";
}else if(onlineAreaPrioList.contains("kids")){
dominantOnlineArea = "kids";
}else if(onlineAreaPrioList.contains("men")){
dominantOnlineArea = "men";
}else if(onlineAreaPrioList.contains("home")){
dominantOnlineArea = "home";
}
return dominantOnlineArea;
}
private static void countPrimaryOnlineArea(ProductDTO productDTO) {
String pOnlineArea = productDTO.getPrimaryOnlineAreaId();
if(OnlineAreaNotEmptyAndNotNull(pOnlineArea))
checkAndIncreaseOnlineAreaCount(pOnlineArea);
}
private static boolean OnlineAreaNotEmptyAndNotNull(String onLineArea) {
boolean onlineAreaFlag = false;
if(null!=onLineArea)
onlineAreaFlag = true;
return onlineAreaFlag;
}
private static void addSecondaryOnlineAreaWithPrimary(ProductDTO productDTO) {
String onlineArea = productDTO.getOnlineAreaIds();
if(OnlineAreaNotEmptyAndNotNull(onlineArea)) {
if(onlineArea.contains("|")) {
String[] onlineAreaSplit = onlineArea.split("\\|");
for(String online : onlineAreaSplit) {
checkAndIncreaseOnlineAreaCount(online);
}
}else {
checkAndIncreaseOnlineAreaCount(onlineArea);
}
}
}
private static void checkAndIncreaseOnlineAreaCount(String onlineArea) {
int count = freq.containsKey(onlineArea) ? freq.get(onlineArea) : 0;
freq.put(onlineArea, count + 1);
}
private static List<ProductDTO> recentlyBought() {
List<ProductDTO> recentlyBoughtList= new ArrayList<ProductDTO>();
ProductDTO productDTO1 = new ProductDTO();
productDTO1.setPrimaryOnlineAreaId("ladies");
productDTO1.setOnlineAreaIds("ladies");
ProductDTO productDTO2 = new ProductDTO();
productDTO2.setPrimaryOnlineAreaId("men");
//productDTO2.setOnlineAreaIds("men"); //comment
recentlyBoughtList.add(productDTO1);
recentlyBoughtList.add(productDTO2);
return recentlyBoughtList;
}
private static List<ProductDTO> recentlyViewed() {
List<ProductDTO> recentlyViewedList= new ArrayList<ProductDTO>();
ProductDTO productDTO1 = new ProductDTO();
productDTO1.setPrimaryOnlineAreaId("home");
productDTO1.setOnlineAreaIds("home");
ProductDTO productDTO2 = new ProductDTO();
//productDTO2.setPrimaryOnlineAreaId("men"); //comment
productDTO2.setOnlineAreaIds("men|kids");
recentlyViewedList.add(productDTO1);
recentlyViewedList.add(productDTO2);
return recentlyViewedList;
}
}
package dto;
public class ProductDTO {
private String primaryOnlineAreaId;
private String onlineAreaIds;
private String ageId;
public String getPrimaryOnlineAreaId() {
return primaryOnlineAreaId;
}
public void setPrimaryOnlineAreaId(String primaryOnlineAreaId) {
this.primaryOnlineAreaId = primaryOnlineAreaId;
}
public String getOnlineAreaIds() {
return onlineAreaIds;
}
public void setOnlineAreaIds(String onlineAreaIds) {
this.onlineAreaIds = onlineAreaIds;
}
public String getAgeId() {
return ageId;
}
public void setAgeId(String ageId) {
this.ageId = ageId;
}
}
Run Code Online (Sandbox Code Playgroud)
一种方法是将if
s 链转换为增强for
循环:
for (String kind : new String[] {"ladies", "kids", "men", "home"}) {
if (onlineAreaPrioList.contains(kind)) {
dominantOnlineArea = kind;
break;
}
}
Run Code Online (Sandbox Code Playgroud)
考虑更换"神奇字符串"(即"ladies"
,"kids"
,"men"
,并"home"
与相应的级别定义字符串常量).
另一种方法是用enum
s 替换"魔术字符串" ,这样可以将类型切换onlineAreaPrioList
为EnumSet
:
public enum PriorityKind {
LADIES, KIDS, MEN, HOME
}
...
EnumSet<PriorityKind> onlineAreaPrioList = new EnumSet<>();
Run Code Online (Sandbox Code Playgroud)
实际上,将它们保持为String
s可能不是一个好主意,因为您希望明确指定它们的优先级。因此,定义一个Enum
可能会更好:
enum Priority {
LADIES(1),
KIDS(2),
MEN(3),
HOME(4);
private final int weight;
Priority(int weight) {
this.weight = weight;
}
public int getWeight() {
return weight;
}
}
Run Code Online (Sandbox Code Playgroud)
然后用法是:
Stream.of(Priority.KIDS, Priority.MEN)
.max(Comparator.comparing(Priority::getWeight))
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
146 次 |
最近记录: |