com.xyzwps.lib.dollar.MESeq Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xyzwps-dollar Show documentation
Show all versions of xyzwps-dollar Show documentation
A lodash-like, lazy and powerful java collection utils
The newest version!
package com.xyzwps.lib.dollar;
import com.xyzwps.lib.dollar.function.Function3;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.BiPredicate;
import java.util.function.Function;
import static com.xyzwps.lib.dollar.Helper.*;
public interface MESeq {
void forEach(BiConsumer consumer);
default MESeq mapValues(Function mapValueFn) {
Objects.requireNonNull(mapValueFn);
return kv2Consumer -> this.forEach((k, v) -> kv2Consumer.accept(k, mapValueFn.apply(v)));
}
default MESeq mapValues(BiFunction mapValueFn) {
Objects.requireNonNull(mapValueFn);
return kv2Consumer -> this.forEach((k, v) -> kv2Consumer.accept(k, mapValueFn.apply(v, k)));
}
default MESeq mapKeys(Function mapKeyFn) {
Objects.requireNonNull(mapKeyFn);
final HashSet dedupSet = new HashSet<>();
return k2vConsumer -> this.forEach((k, v) -> {
K2 k2 = mapKeyFn.apply(k);
if (!dedupSet.contains(k2)) {
dedupSet.add(k2);
k2vConsumer.accept(k2, v);
}
});
}
default MESeq mapKeys(BiFunction mapKeyFn) {
Objects.requireNonNull(mapKeyFn);
final HashSet dedupSet = new HashSet<>();
return k2vConsumer -> this.forEach((k, v) -> {
K2 k2 = mapKeyFn.apply(k, v);
if (!dedupSet.contains(k2)) {
dedupSet.add(k2);
k2vConsumer.accept(k2, v);
}
});
}
default MESeq filter(BiPredicate predicateFn) {
Objects.requireNonNull(predicateFn);
return kvConsumer -> this.forEach((k, v) -> {
if (predicateFn.test(k, v)) {
kvConsumer.accept(k, v);
}
});
}
default R reduce(R initValue, Function3 callbackFn) {
Objects.requireNonNull(callbackFn);
Holder rHolder = new Holder<>(initValue);
this.forEach((k, v) -> rHolder.value = callbackFn.apply(rHolder.value, k, v));
return rHolder.value;
}
default HashMap value() {
HashMap result = new HashMap<>();
this.forEach(result::put);
return result;
}
default Seq values() {
return vConsumer -> this.forEach((k, v) -> vConsumer.accept(v));
}
default Seq keys() {
return vConsumer -> this.forEach((k, v) -> vConsumer.accept(k));
}
static MESeq empty() {
return kvConsumer -> {
};
}
}