由于在工作中需要用JDK1.8提供的Stream中的常规操作,特意在JDK1.7中使用迭代器来简易的实现了Stream的一些过滤和返回List的功能。

使用示例

//equals、toList
List<XXX> collect = new Stream<XXX>(dataList)
                        .filterBeanEquals("year", currentYear)
                        .toList();



//join
String yearListStr = new Stream<String>(yearList).join(",");



//使用匿名内部类的形式实现 filter
List<XXX> addBusinessList = new Stream<WashFinThresholdData>(dataList).filter(new StreamFilter<XXXX>() {
            @Override
            public boolean filter(XXX xxx) {
                return xxx.getYear().equals(newRuleParam.getYear())
                        || preYearBusinessList.contains(xxx.getInitValue());
            }
        }).toList();


//map、toList
List<String> preYearBusinessList = new Stream<XXX>(dataList)
                .filterBeanEquals("year", String.valueOf(Integer.parseInt(newRuleParam.getYear()) - 1))
                .mappingToList("initValue");

代码实现


import com.alibaba.fastjson.JSONObject;

import java.lang.reflect.Field;
import java.util.*;

/**
 * @Author: zhs
 * @Date: 17/07/2023 10:33
 * @Version: 1.0
 * @Description: 简单仿造jdk1.8 Stream
 *
 */
public class Stream<T> {

    private Collection<T> originList;

    private Stream() {
    }

    public Stream(Collection<T> list) {
        Iterator<T> iterator = list.iterator();
        ArrayList<T> mList = new ArrayList<>();
        while (iterator.hasNext()){
            mList.add(iterator.next());
        }
        this.originList = mList;
    }

    /**
     * 实现list的join
     *
     * @param delimiter 分隔符
     * @return
     */
    public String join(String delimiter) {
        StringBuffer buffer = new StringBuffer();
        Iterator<T> iterator = originList.iterator();
        while (iterator.hasNext()){
            T item = iterator.next();
            if (buffer.length() != 0) {
                buffer.append(delimiter);
            }
            buffer.append(item.toString());
        }
        return buffer.toString();
    }

    /**
     * 返回ArrayList
     *
     * @return
     */
    public List<T> toList() {
        ArrayList<T> list = new ArrayList<>();
        Iterator<T> iterator = this.originList.iterator();
        while (iterator.hasNext()){
            T item = iterator.next();
            list.add(item);
        }
        return list;
    }

    /**
     * List转Map,仅支持常规Bean和JSONObject2
     *
     * @param column 需要判断的列名
     * @return
     */
    public Map<String, List<T>> groupingBy(String column) {
        Map<String, List<T>> map = new LinkedHashMap<>();
        Iterator<T> iterator = this.originList.iterator();
        while (iterator.hasNext()){
            T item = iterator.next();
            String currentValue = null;
            if (item instanceof JSONObject) {
                JSONObject jsonObject = (JSONObject) item;
                currentValue = jsonObject.get(column).toString();
                if (currentValue == null) {
                    throw new NullPointerException("element cannot be mapped to a null key");
                }
            } else {
                try {
                    Field declaredField = item.getClass().getDeclaredField(column);
                    declaredField.setAccessible(true);
                    currentValue = declaredField.get(item).toString();
                } catch (NoSuchFieldException | IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
            if (map.containsKey(currentValue)) {
                map.get(currentValue).add(item);
            } else {
                ArrayList<T> es = new ArrayList<>();
                es.add(item);
                map.put(currentValue, es);
            }
        }
        return map;
    }

    /**
     * 初略仿造Stream的map映射某列的方法
     *
     * @param column
     * @return
     */
    public List mappingToList(String column) {
        List list = new ArrayList();
        try {
            Iterator iterator = this.originList.iterator();
            while (iterator.hasNext()) {
                Object item = iterator.next();
                if (item instanceof JSONObject) {
                    JSONObject jsonObject = (JSONObject) item;
                    list.add(jsonObject.get(column));
                } else {
                    Field declaredField = item.getClass().getDeclaredField(column);
                    declaredField.setAccessible(true);
                    Object currentValue = declaredField.get(item);
                    list.add(currentValue);
                }
            }
        } catch (NoSuchFieldException | IllegalAccessException e) {
            throw new RuntimeException(e);
        }
        return list;
    }

    /**
     * 使用匿名内部类自己实现filter方法
     * @param streamFilter
     * @return
     */
    public Stream<T> filter(StreamFilter<T> streamFilter) {
        Iterator<T> iterator = this.originList.iterator();
        while (iterator.hasNext()){
            if(!streamFilter.filter(iterator.next())){
                iterator.remove();
            }
        }
        return this;
    }

    /**
     * 过滤是否相等
     *
     * @param column
     * @return
     */
    public Stream<T> filterJSONEquals(String column, Object value) {
        Iterator iterator = this.originList.iterator();
        while (iterator.hasNext()) {
            JSONObject item = (JSONObject) iterator.next();
            if (!item.get(column).toString().equals(value.toString())) {
                iterator.remove();
            }
        }
        return this;
    }

    /**
     * 过滤是否相等
     *
     * @param column
     * @return
     */
    public Stream<T> filterBeanEquals(String column, Object value) {
        Iterator iterator = this.originList.iterator();
        while (iterator.hasNext()) {
            Object item = iterator.next();
            try {
                Field declaredField = item.getClass().getDeclaredField(column);
                declaredField.setAccessible(true);
                Object currentValue = declaredField.get(item);
                if (!currentValue.toString().equals(value.toString())) {
                    iterator.remove();
                }
            } catch (NoSuchFieldException | IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
        return this;
    }

    public Stream<T> filterEmpty() {
        return filterEmpty(null);
    }

    /**
     * 过滤是否为空
     *
     * @param column 需要判断的列名
     * @return
     */
    public Stream<T> filterEmpty(String column) {
        Iterator iterator = this.originList.iterator();
        while (iterator.hasNext()) {
            Object item = iterator.next();
            if (StreamUtils.checkNull(item, column)) {
                iterator.remove();
            }
        }
        return this;
    }

}
/**
 * @Author: zhs
 * @Date: 17/07/2023 15:11
 * @Version: 1.0
 * @Description: 用于自定义StreamFilter
 */
public interface StreamFilter<T> {

    /**
     * 主要用于自定义filter方法,自己创建匿名内部类实现
     * @return
     */
    boolean filter(T t);

}
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.ArrayList;

/**
 * @Author: zhs
 * @Date: 17/07/2023 14:28
 * @Version: 1.0
 * @Description: 针对某些情况对数据进行转换成Stream
 */
public class StreamTrans {

    public static Stream<JSONObject> JSONArrayToStream(JSONArray jsonArray){
        ArrayList<JSONObject> jsonObjectList = new ArrayList<>();
        for (int i = 0; i < jsonArray.size(); i++) {
            jsonObjectList.add(JSONObject.parseObject(jsonArray.get(i).toString()));
        }
        return new Stream<JSONObject>(jsonObjectList);
    }

}
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

/**
 * @Author: zhs
 * @Date: 17/07/2023 15:49
 * @Version: 1.0
 * @Description:
 */
public class StreamUtils {

    /**
     * 判断是否为空
     * 默认实现字符串和JSONObject2判断
     *
     * @param obj
     * @param column 需要判断的列名
     * @return
     */
    public static boolean checkNull(Object obj, String column) {
        if (obj == null) {
            return true;
        } else if (obj instanceof String) {
            return StringUtils.isEmpty(obj.toString());
        } else if (obj instanceof JSONObject) {
            JSONObject jsonObject = (JSONObject) obj;
            return jsonObject.get(column) == null || StringUtils.isEmpty(jsonObject.get(column).toString());
        }
        return false;
    }
}