package simple.code;

/**
 * simplify if-elif-elif-else when return is boolean
 * @author weijun.zou
 * Create on 2017/12/6
 */
public class Loader {

    private boolean load1(String args) {
        if (args == null) {
            return false;
        } else if (args.equals("")) {
            return defaultLoad();
        } else if (args.startsWith("a")) {
            return aLoad(args);
        } else if (args.startsWith("b")) {
            return bLoad(args);
        } else if (args.startsWith("c")) {
            return cLoad(args);
        } else {
            return false;
        }
    }

    // warn : it is not equals load1 ,so you need think carefully
    // if change method, such as load1(T t),load2(T t)
    // if t meet the conditions 'a' and t also meet conditions 'b',but aLoad(t) is false,bLoad(t) is true
    // the method load1(T t) is false,the method load2(T t) is true;
    // where t is a String,so t could not startWith 'a' and 'b'
    private boolean load2(String args) {
        return args != null && (
                (args.equals("") && defaultLoad())
                || (args.startsWith("a") && aLoad(args))
                || (args.startsWith("b") && bLoad(args))
                || (args.startsWith("c") && cLoad(args))
        );
    }

    private boolean defaultLoad() {
        // do something
        return true;
    }

    private boolean aLoad(String args) {
        // do something
        return true;
    }

    private boolean bLoad(String args) {
        // do something
        return true;
    }

    private boolean cLoad(String args) {
        // do something
        return true;
    }

}
package simple.code;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiFunction;

/**
 * simplify if-elif-elif-else when you need mapping
 * @author weijun.zou
 * Create on 2017/12/6
 */
public class Calculator {

    public int compute1(int a, char f, int b) {
        if (f == '+') {
            return a + b;
        } else if (f == '-') {
            return a - b;
        } else if (f == '*') {
            return a * b;
        } else if (f == '/') {
            return a / b;
        } else {
            return a % b;
        }
    }

    //use switch
    public int compute2(int a, char f, int b) {
        switch (f) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                return a / b;
            default:
                return a % b;
        }
    }

    //use '? :' , it's so simple
    public int compute3(int a, char f, int b) {
        int res = f == '+' ? a + b
                : f == '-' ? a - b
                : f == '*' ? a * b
                : f == '/' ? a / b
                : a % b;
        return res;
    }

    private Map> computeMap = new HashMap<>();

    {
        computeMap.put('+', (a, b) -> a + b);
        computeMap.put('-', (a, b) -> a - b);
        computeMap.put('*', (a, b) -> a * b);
        computeMap.put('/', (a, b) -> a / b);
        computeMap.put('%', (a, b) -> a % b);
    }
    //use map,you can dynamic increase expression,such as 'a^b','max(a,b)',...
    public int compute4(int a, char f, int b) {
        return computeMap.getOrDefault(f, computeMap.get('%')).apply(a, b);
    }

}
package simple.code;

import java.util.List;

/**
 * simplify 'for'
 *
 * @author weijun.zou
 * Create on 2017/12/6
 */
public class Sum {

    //this is a bad demo, time complexity is O(n^2) when you use LinkedList
    //so never use "for(i=0;i list, int minLimit, int maxLimit) {
        long sum = 0;
        for (int i = 0; i < list.size(); i++) {
            if (list.get(i) >= minLimit && list.get(i) <= maxLimit) {
                sum += list.get(i);
            }
        }
        return sum;
    }

    //foreach
    public long rangeSum2(List list, int minLimit, int maxLimit) {
        long sum = 0;
        for (int e : list) {
            sum += (e >= minLimit && e <= maxLimit) ? e : 0;
        }
        return sum;
    }

    //stream and lambda,I love this style of coding
    public long rangeSum3(List list, int minLimit, int maxLimit) {
        return list.stream()
                .mapToInt(Integer::intValue)
                .filter(e -> e >= minLimit)
                .filter(e -> e <= maxLimit)
                .asLongStream()
                .sum();
    }
}
package simple.code;

import java.util.*;

import static java.util.stream.Collectors.groupingBy;

/**
 * @author weijun.zou
 * Create on 2017/12/6
 */
public class WordUtils {

    //In the past, you need to do this
    public static String mostWord1(String... words) {
        Map wordMap = new HashMap<>();
        for (String word : words) {
            if (wordMap.containsKey(word)) {
                wordMap.put(word, wordMap.get(word) + 1);
            } else {
                wordMap.put(word, 1);
            }
        }
        String mostWord = null;
        int most = 0;
        for (Map.Entry entry : wordMap.entrySet()) {
            if (entry.getValue()>most){
                mostWord = entry.getKey();
                most = entry.getValue();
            }
        }
        return mostWord;
    }

    //now you can do this
    public static String mostWord2(String...words){
        return Arrays.stream(words)
                .collect(groupingBy(String::toString))
                .entrySet()
                .stream()
                .map(Map.Entry::getValue)
                .max(Comparator.comparingInt(List::size))
                .orElse(Collections.singletonList(null))
                .get(0);
    }
}