/*
 * 文 件 名:  ListUtils.java
 * 版    权:  浩鲸云计算科技有限公司
 * 描    述:  <描述>
 * 修 改 人:  lvwenbin
 * 修改时间:  2018年09月20日
 * 修改内容:  <修改内容>
 */
package com.huashe.common.utils;

import com.huashe.common.utils.filter.ObjConverter;
import com.huashe.common.utils.filter.ObjectFilter;
import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * List相关工具 <功能详细描述>
 *
 * @author lvwenbin
 * @version [版本号, 2013年10月31日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class ListUtils {
    /**
     * 非空过滤
     */
    public static final ObjectFilter<Object> NON_NULL = new ObjectFilter<Object>() {
        @Override
        public boolean accept(Object object) {
            return object != null;
        }
    };

    /**
     * 按Filter过滤 <功能详细描述>
     *
     * @param source 源List
     * @param filter 过滤器
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static <T> List<T> filterList(List<T> source, ObjectFilter<T> filter) {
        return filterList(source, filter, new ArrayList<T>());
    }

    /**
     * 按Filter过滤后融合 <功能详细描述>
     *
     * @param source 源List
     * @param filter 过滤器
     * @param target 目标list
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static <T> List<T> filterList(List<T> source, ObjectFilter<T> filter, List<T> target) {
        if (target == null) {
            return filterList(source, filter);
        }

        if (CollectionUtils.isNotEmpty(source)) {
            if (filter == null) {
                target.addAll(source);
            }
            else {
                for (T t : source) {
                    if (!filter.accept(t)) {
                        continue;
                    }

                    target.add(t);
                }
            }
        }
        return target;
    }

    /**
     * 从0下标开始截取List <功能详细描述>
     *
     * @param source   源list
     * @param endIndex 结束下标
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static <T> List<T> subList(List<T> source, int endIndex) {
        return subList(source, 0, endIndex);
    }

    /**
     * 截取List <功能详细描述>
     *
     * @param source     源list
     * @param beginIndex 开始下标
     * @param endIndex   结束下标
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static <T> List<T> subList(List<T> source, int beginIndex, int endIndex) {
        List<T> retList = new ArrayList<T>();

        if (CollectionUtils.isEmpty(source)) {
            return retList;
        }

        for (int i = beginIndex; i <= (source.size() - 1); i++) {
            retList.add(source.get(i));

            if (i == endIndex) {
                break;
            }
        }

        return retList;
    }

    /**
     * 对象转换器
     *
     * @param sourceList 源列表
     * @param converter  转换器
     * @param <S>        源对象类型
     * @param <T>        目标对象类型
     * @return 输出列表
     */
    public static <S, T> List<T> convert(List<S> sourceList, ObjConverter<S, T> converter) {
        List<T> targetList = new ArrayList<>();

        if (CollectionUtils.isNotEmpty(sourceList)) {
            for (S source : sourceList) {
                T target = converter.convert(source);
                targetList.add(target);
            }
        }

        return targetList;
    }
}
