一、依赖
<dependency>
<groupId>io.vavr</groupId>
<artifactId>vavr</artifactId>
</dependency>
二、使用示例
package com.cagmss.function;
import com.cagmss.common_core.utils.number.NumberUtils;
import io.vavr.Function1;
import io.vavr.Function2;
import io.vavr.Function3;
import io.vavr.Tuple2;
import io.vavr.control.Option;
import io.vavr.control.Try;
import lombok.extern.slf4j.Slf4j;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Objects;
@Slf4j
public class FunctionDemo {
public static void main(String[] args) {
tryTest();
}
private static void tryTest() {
Try<Integer> onFailure = Try.of(() -> 1 / 1)
.onFailure((e) -> log.error("失败{}", e.getMessage()))
.onFailure(NullPointerException.class, (ne) -> System.out.println(ne.getMessage()))
.onSuccess(o -> log.info("成功{}", o));
Try<FileReader> readers = Try.of(() -> new FileReader(""));
readers.mapTry(BufferedReader::new)
.andThenTry((name) -> {
int i = 1 / 0;
while (true) {
String line = name.readLine();
if (Objects.isNull(line)) {
break;
}
System.out.println(line);
}
}).onFailure(e -> log.error(e.getMessage()))
.andFinally(() -> readers.andThenTry(InputStreamReader::close));
Try<Throwable> failed = Try.of(() -> 1 / 0)
.peek(i -> log.info(String.valueOf(i)))
.failed();
Throwable cause = Try.of(() -> 1 / 0)
.getCause();
Try<Integer> andFinally = Try.of(() -> 1 / 1)
.peek(i -> log.info(String.valueOf(i)))
.andFinally(() -> log.info("最终执行"))
.andFinallyTry(() -> log.info("执行"));
Try<Integer> integers = Try.of(() -> 1 / 1)
.filter(i -> i > 10)
.peek(i -> log.info(String.valueOf(i)))
.andThenTry((i) -> log.info("andThenTry {}", i))
.andThenTry((i) -> log.info("andThenTry {}", i));
Try<Integer> integerTry = Try.of(() -> 1 / 1)
.filter(i -> false, (o) -> new RuntimeException("过滤失败,创建异常"))
.peek(i -> log.info("过滤结果为true"))
.onFailure((e) -> log.error("filter失败{}", e.getMessage()))
.onSuccess(o -> log.info("filter成功{}", o));
Try<Integer> integers1 = Try.of(() -> 1 / 1)
.map(i -> i + 1)
.mapTry(i -> i * 10)
.onFailure((e) -> log.error("map失败{}", e.getMessage()))
.onSuccess(o -> log.info("map成功{}", o));
Integer fold = Try.of(() -> 1 / 1)
.fold(e -> 10, i -> 10);
Integer integers2 = Try.of(() -> 1 / 0)
.peek(NumberUtils::throwInvalidDouble)
.recover(IOException.class, e -> {
log.warn("IOException:" + e.getMessage());
return 1;
})
.recover(ArithmeticException.class, e -> {
log.warn("ArithmeticException:" + e.getMessage());
return 1;
})
.onFailure(e -> log.error(e.getMessage()))
.getOrElseThrow(e -> new RuntimeException(e));
Try<Integer> integers3 = Try.of(() -> 1 / 0)
.recoverWith(Exception.class, e -> Try.of(() -> 0));
Try<Integer> integers4 = Try.of(() -> Try.of(() -> 0))
.flatMap(t -> t);
System.out.println(integers4.get());
}
private static void function() {
Function2<Integer, Integer, Integer> f21 = (a, b) -> a - b;
Function2<Integer, Integer, Integer> f22 = (a, b) -> a * b;
Function2<Integer, Integer, Integer> then = f21.andThen((r) -> r + 10);
Function1<Tuple2<Integer, Integer>, Integer> tupled = f21.tupled();
Function1<Integer, Integer> apply1 = f21.curried().apply(1);
Integer apply = apply1.curried().apply(1);
System.out.println("科里化 " + apply);
Function2<Integer, Integer, Integer> reversed = f21.reversed();
Function1<Integer, Integer> apply2 = reversed.apply(1);
Integer apply3 = apply2.apply(2);
System.out.println("逆转,部分应用 " + apply3);
Function3<Integer, Integer, Integer, Integer> f3 = (a, b, c) -> a + b + c;
Function1<Integer, Function1<Integer, Integer>> apply5 = f3.curried().apply(1);
Integer res = apply5.apply(4).apply(3);
System.out.println("3参科里化 " + res);
Function1<Integer, Integer> apply6 = f3.apply(1, 2);
Integer apply7 = apply6.apply(1);
System.out.println("3参部分应用" + apply7);
int arity = f21.arity();
System.out.println("函数参数数量 " + arity);
Function2<Integer, Integer, Integer> memoized = f21.memoized();
Integer apply4 = memoized.apply(1, 2);
System.out.println(apply4);
apply4 = memoized.apply(2, 1);
System.out.println(apply4);
Function2<Object, Object, Integer> constant = Function2.constant(2);
System.out.println("函数常量 " + constant.apply(1, 1));
Function1<Object, Integer> apply8 = constant.apply(1);
System.out.println(apply8.apply(2));
Function2<Integer, Integer, Option<Integer>> lift = Function2.lift((a, b) -> a / b);
Option<Integer> option = lift.apply(1, 0);
Integer orNull = option.getOrNull();
System.out.println("getOrNull" + orNull);
Function2<Integer, Integer, Try<Integer>> lift2 = Function2.liftTry((a, b) -> a / b);
Try<Integer> apply9 = lift2.apply(1, 0);
Function2<Integer, Integer, Integer> narrow = Function2.narrow((a, b) -> a + b);
Integer apply10 = narrow.apply(1, 2);
System.out.println(apply10);
}
}