由于在工作中需要用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;
}
}