Java 8 Stream 中異常處理--收集異常,不停止流處理

對於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】!

學習自博主鏈接這裏這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章