枚举+Lambda 实现策略方法

1 枚举(策略方法)

package com.draymond.mp.code.controller;

import java.math.BigDecimal;
import java.util.function.DoubleBinaryOperator;

/**
 * @Auther: ZhangSuchao
 * @Date: 2020/8/10 21:21
 */
public enum Operator {

    PLUS("+", (x, y) -> x + y),
    MINUS("-", (x, y) -> subtract(x, y)),   // 减法
    TIMES("*", (x, y) -> x * y),
    DIVIDE("/", (x, y) -> x / y);


    private final String symbol;
    private final DoubleBinaryOperator op;

    Operator(String symbol, DoubleBinaryOperator op) {
        this.symbol = symbol;
        this.op = op;
    }

    @Override
    public String toString() {
        return symbol;
    }

    public double apply(double x, double y) {
        return op.applyAsDouble(x, y);
    }


    /**
     * 减法
     *
     * @param x
     * @param y
     * @return
     */
    private static double subtract(double x, double y) {
        BigDecimal bigDecimalX = new BigDecimal(Double.toString(x));
        BigDecimal bigDecimalY = new BigDecimal(Double.toString(x));
        return bigDecimalX.subtract(bigDecimalY).doubleValue();
    }
}
  • PLUS、MINUS、TIMES、DIVIDE 是不同的策略方法

  • MINUS("-", (x, y) -> subtract(x, y)), // 减法。。。如果实现的策略比较长,也可以抽离出逻辑单元,保证代码的易阅读、可维护(也可以抽离到Utils种)

2 调用方式

    public static void main(String[] args) {

        double apply = Operator.MINUS.apply(2.3, 1.1);
        System.out.println(apply);      // 1.2

        System.out.println(2.3 - 1.1);  // 1.1999999999999997

    }

double类型的 + - * / 操作会有问题,,比如"2.3-1.1= 1.1999999999999997";;
应该使用 BigDecimal 的方式,且需要" Double.toString(y)",转换一下

注:本文参考 effective java 书籍

你可能感兴趣的:(effective-java)