This commit is contained in:
@@ -22,7 +22,7 @@ import java.util.stream.*;
|
|||||||
*
|
*
|
||||||
* @author zhangjx
|
* @author zhangjx
|
||||||
*/
|
*/
|
||||||
final class EntityCache<T> {
|
public final class EntityCache<T> {
|
||||||
|
|
||||||
private static final Logger logger = Logger.getLogger(EntityCache.class.getName());
|
private static final Logger logger = Logger.getLogger(EntityCache.class.getName());
|
||||||
|
|
||||||
@@ -102,7 +102,7 @@ final class EntityCache<T> {
|
|||||||
return (filter != null) && listStream().filter(filter).findFirst().isPresent();
|
return (filter != null) && listStream().filter(filter).findFirst().isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
public <K, V> Map<Serializable, Number> getMapResult(final Attribute<T, K> keyAttr, final Reckon reckon, final Attribute<T, V> reckonAttr, final Predicate<T> filter) {
|
public <K, V> Map<Serializable, Number> getMapResult(final Attribute<T, K> keyAttr, final Reckon reckon, final Attribute reckonAttr, final Predicate<T> filter) {
|
||||||
Stream<T> stream = listStream();
|
Stream<T> stream = listStream();
|
||||||
if (filter != null) stream = stream.filter(filter);
|
if (filter != null) stream = stream.filter(filter);
|
||||||
Collector<T, Map, ?> collector = null;
|
Collector<T, Map, ?> collector = null;
|
||||||
@@ -117,11 +117,13 @@ final class EntityCache<T> {
|
|||||||
break;
|
break;
|
||||||
case COUNT: collector = (Collector<T, Map, ?>) Collectors.counting();
|
case COUNT: collector = (Collector<T, Map, ?>) Collectors.counting();
|
||||||
break;
|
break;
|
||||||
case DISTINCTCOUNT: collector = (Collector<T, Map, ?>) Collectors.counting();
|
case DISTINCTCOUNT:
|
||||||
|
collector = (Collector<T, Map, ?>) Collectors.mapping((t) -> reckonAttr.get(t), Collectors.toSet());
|
||||||
break;
|
break;
|
||||||
case MAX: collector = (Collector<T, Map, ?>) Collectors.maxBy(null);
|
case MAX:
|
||||||
break;
|
case MIN:
|
||||||
case MIN: collector = (Collector<T, Map, ?>) Collectors.minBy(null);
|
Comparator<T> comp = (o1, o2) -> o1 == null ? (o2 == null ? 0 : -1) : ((Comparable) reckonAttr.get(o1)).compareTo(reckonAttr.get(o2));
|
||||||
|
collector = (Collector<T, Map, ?>) ((reckon == MAX) ? Collectors.maxBy(comp) : Collectors.minBy(comp));
|
||||||
break;
|
break;
|
||||||
case SUM:
|
case SUM:
|
||||||
if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) {
|
if (valtype == float.class || valtype == Float.class || valtype == double.class || valtype == Double.class) {
|
||||||
@@ -131,7 +133,18 @@ final class EntityCache<T> {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
final Map rs = stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector));
|
Map rs = stream.collect(Collectors.groupingBy(t -> keyAttr.get(t), LinkedHashMap::new, collector));
|
||||||
|
if (reckon == MAX || reckon == MIN) {
|
||||||
|
Map rs2 = new LinkedHashMap();
|
||||||
|
rs.forEach((x, y) -> {
|
||||||
|
if (((Optional) y).isPresent()) rs2.put(x, reckonAttr.get((T) ((Optional) y).get()));
|
||||||
|
});
|
||||||
|
rs = rs2;
|
||||||
|
} else if (reckon == DISTINCTCOUNT) {
|
||||||
|
Map rs2 = new LinkedHashMap();
|
||||||
|
rs.forEach((x, y) -> rs2.put(x, ((Set) y).size()));
|
||||||
|
rs = rs2;
|
||||||
|
}
|
||||||
return rs;
|
return rs;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,7 +359,7 @@ final class EntityCache<T> {
|
|||||||
return this.list.size() > 1024 * 16;
|
return this.list.size() > 1024 * 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Stream<T> listStream() {
|
private Stream<T> listStream() {
|
||||||
return isParallel() ? this.list.parallelStream() : this.list.stream();
|
return isParallel() ? this.list.parallelStream() : this.list.stream();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user