對於Java 8的Stream,個人很喜歡用來做批處理,但是工作中,較難對數據有完全預估。若數據超出預期,會導致stream停止,
我們即想要獲取異常的數據,又想要完成正確數據的處理,該怎麼辦?
那麼我們就需要一個方法來優雅地完成這個任務!!!如果你說在lambda 寫try..catch..那就當我沒說......
話不多說直接上代碼!!!!!!
@FunctionalInterface
public interface CheckedFunction<T,R> {
R apply(T t) throws Exception;
}
import jdk.nashorn.internal.objects.annotations.Getter;
import org.apache.commons.lang3.tuple.Pair;
import java.util.Optional;
import java.util.function.Function;
public class Either<L, R> {
private final L left;
private final R right;
private Either(L left, R right) {
this.left = left;
this.right = right;
}
public static <T, R> Function<T, Either> liftWithValue(CheckedFunction<T, R> function) {
return t -> {
try {
return Either.Right(function.apply(t));
} catch (Exception ex) {
return Either.Left(Pair.of(ex, t));
}
};
}
public static <T, R> Function<T, Either> lift(CheckedFunction<T, R> function) {
return t -> {
try {
return Either.Right(function.apply(t));
} catch (Exception ex) {
return Either.Left(ex);
}
};
}
public static <L, R> Either<L, R> Left(L value) {
return new Either(value, null);
}
public static <L, R> Either<L, R> Right(R value) {
return new Either(null, value);
}
public <T> Optional<T> mapLeft(Function<? super L, T> mapper) {
if (isLeft()) {
return Optional.of(mapper.apply(left));
}
return Optional.empty();
}
public <T> Optional<T> mapRight(Function<? super R, T> mapper) {
if (isRight()) {
return Optional.of(mapper.apply(right));
}
return Optional.empty();
}
public String toString() {
if (isLeft()) {
return "Left(" + left + ")";
}
return "Right(" + right + ")";
}
public Optional<L> getLeft() {
return Optional.ofNullable(left);
}
public Optional<R> getRight() {
return Optional.ofNullable(right);
}
public boolean isLeft() {
return left != null;
}
public boolean isRight() {
return right != null;
}
}
再來解釋下
CheckedFunction,屬於自己定義的一個方法接口,爲函數編寫自己的方法接口
Either 則將處理的數據分爲兩部分,異常的部分放入left,正確的數據放入Right。
那麼我們就把正確1處理的數據和異常的數據區分開了。
具體實現方法如下:
List<String> valueStrs = new ArrayList();
valueStrs.parallelStream()
.map(Either.liftWithValue(val -> doSomething(val)))
.forEach(value -> {
System.out.println(JSONObject.toJSONString(value.getLeft().get()));
if (value.getRight().isPresent()) {
tList.add((T) value.getRight().get());
}
});
這裏我只取出了正確的數據,可根據自己需要收集異常數據。
感謝博主【zl1zl2zl3】!
學習自博主鏈接這裏這裏