究极无敌最终版!!!
方案1版本代码(mapB2在diff中返回两次):
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DataSelector {
private List> mainList;
private List> subList;
private List paramNames;
public static DataSelector init(List paramNames) {
DataSelector dataSelector = new DataSelector();
dataSelector.paramNames = paramNames;
return dataSelector;
}
public DataSelector addMain(List> mainList) {
this.mainList = mainList;
return this;
}
public DataSelector addSub(List> subList) {
this.subList = subList;
return this;
}
public Result select() {
Result result = new Result();
SelectCollectorImpl.Result mainResult = this.mainList.stream().collect(new SelectCollectorImpl(this.paramNames));
Set valueSet = mainResult.getValueSet();
for (Map map : this.subList) {
SelectCollectorImpl.Result subResult = SelectCollectorImpl.Result.init(map, this.paramNames);
if (valueSet.contains(subResult.getFirstValue())) {
result.addSame(map);
}else {
List> relatedMapList = mainResult.getRelatedMapList();
for (Map relatedMap : relatedMapList) {
List diffParamNames = this.paramNames.stream().filter(paramName -> !map.get(paramName).equals(relatedMap.get(paramName))).collect(Collectors.toList());
if (diffParamNames.size() != this.paramNames.size()) {
result.addDiff(map, diffParamNames);
}
}
}
}
return result;
}
@Getter
@Setter(value = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@ToString
static class Result {
private List> sameList = new ArrayList<>();
private List diffList = new ArrayList<>();
public Result addSame(Map map) {
this.sameList.add(map);
return this;
}
public Result addDiff(Map data, List paramNames) {
Diff diff = new Diff(data, paramNames);
this.diffList.add(diff);
return this;
}
@Getter
@Setter(value = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@ToString
static class Diff {
private Map data;
private List paramNames;
}
}
}
@AllArgsConstructor
public class SelectCollectorImpl implements Collector, SelectCollectorImpl.Result, SelectCollectorImpl.Result> {
private List keys;
@Override
public Supplier supplier() {
return Result::new;
}
@Override
public BiConsumer> accumulator() {
return (result, map) -> result.addValue(map, this.keys);
}
@Override
public BinaryOperator combiner() {
return Result::merge;
}
@Override
public Function finisher() {
return Function.identity();
}
@Override
public Set characteristics() {
return Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));
}
@Getter
@Setter(value = AccessLevel.PRIVATE)
static class Result {
private Set valueSet = new HashSet<>();
private List> relatedMapList = new ArrayList<>();
public String getFirstValue() {
return this.valueSet.strea