小知识点 - Java中关于大量if-else的优化案例

如题,今天在学习if-else优化方法的时候,看到一个朋友的评论,特地实现了一下来提高自己对优化方法的理解。

优化方法学习博客:https://www.cnblogs.com/jay-huaxiao/p/12586598.html

在上面的博客里,评论中一位朋友想要将下面的代码进行优化:

let seat = graphChartList[graphChartList.length - 1]
if (element.srcType === 0) {
	if (index < 5) {
		seat.x = 600
		seat.y = (element.srcIp && element.dstIp) ? index * 120 : 600
	} else if (index < 10) {
		seat.x = 400
		seat.y = (element.srcIp && element.dstIp) ? (index - 5) * 120 : 600
	} else if (index < 15) {
		seat.x = 200
		seat.y = (element.srcIp && element.dstIp) ? (index - 10) * 120 : 600
	} else {
		seat.x = 0
		seat.y = (element.srcIp && element.dstIp) ? (index - 15) * 120 : 600
	}
} else if (element.srcType === 1) {
	seat.x = 800
	seat.y = (element.srcIp && element.dstIp) ? 300 : 600
} else if (element.srcType === 2) {
	seat.x = 1000
	seat.y = (element.srcIp && element.dstIp) ? (length - (index)) * 150 : 600
} else if (element.srcType === 3) {
	seat.x = 1200
	seat.y = (element.srcIp && element.dstIp) ? 300 : 600
}

首先声明,这一段代码应该是JavaScript代码,但是我用的是Java的方式来处理这段代码。

我的主要思路是表驱动法 + for循环来优化大量的if-else。

emmmm 虽然我并不知道详细的数据关系,但比葫芦画瓢,我创建了Element、Seat类,如下:

// Element类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Element {
    private Integer srcType;
    private Boolean srcIp;
    private Boolean distIp;
}

// Seat类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Seat {
    private Integer x;
    private Integer y;
}

主测试类:

public class IfElseOptimization {
     
    public static void main(String[] args) {
        Element element = new Element(1, true, true);
        Seat seat = getSeat(element, 6, 20);
        System.out.println("seat = " + seat);
    }


    public static Seat getSeat(final Element element, final Integer index, final Integer length) {
        // data
        final int[] indexes = {5, 10, 15};
        Map<Integer, Supplier<Seat>> srcTypeMap = new HashMap<>();
        Map<Integer, Supplier<Seat>> indexMap = new HashMap<>();

        // init index map
        indexMap.put(5, () -> new Seat(600, (element.getSrcIp() && element.getDistIp()) ? index * 120 : 600));
        indexMap.put(10, () -> new Seat(400, (element.getSrcIp() && element.getDistIp()) ? (index - 5) * 120 : 600));
        indexMap.put(15, () -> new Seat(200, (element.getSrcIp() && element.getDistIp()) ? (index - 10) * 120 : 600));
        indexMap.put(-1, () -> new Seat(0, (element.getSrcIp() && element.getDistIp()) ? (index - 15) * 120 : 600));

        // init src type map
        srcTypeMap.put(0, () -> {
            int key = -1;
            for (int value : indexes) {
                if (index < value) {
                    key = value;
                    break;
                }
            }
            return indexMap.get(key).get();
        });
        srcTypeMap.put(1, () -> new Seat(800, (element.getSrcIp() && element.getDistIp()) ? 300 : 600));
        srcTypeMap.put(2, () -> new Seat(1000, (element.getSrcIp() && element.getDistIp()) ? (length - (index)) * 150 : 600));
        srcTypeMap.put(3, () -> new Seat(1200, (element.getSrcIp() && element.getDistIp()) ? 300 : 600));


        // invoke
        return srcTypeMap.get(element.getSrcType()).get();
    }

}

hhhhhhhhh,真就强行优化呗~

不过目标也算是勉强完成了,减少了大量出现的if-else。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值