Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何加入两个成功的尝试?_Java_Try Catch_Vavr - Fatal编程技术网

Java 我如何加入两个成功的尝试?

Java 我如何加入两个成功的尝试?,java,try-catch,vavr,Java,Try Catch,Vavr,我还在学习Javaslang/Vavr,请原谅我的无知。我正在做的项目被困在Javaslang 2.1.0上 我的问题是:是否有一种更“实用”的方式(与命令式风格相反)来构造我的代码,以便在多个try成功后加入它们 我想独立地尝试每个输入,目的是获得尽可能多的错误信息-我不想在遇到第一个错误时停止(因此orElse()等不会起作用)。但一旦不再发现错误,我想做一些涉及所有输入的进一步工作 我当前的代码如下(适当匿名): Try amountTry=Try.of(this::readNumber)

我还在学习Javaslang/Vavr,请原谅我的无知。我正在做的项目被困在Javaslang 2.1.0

我的问题是:是否有一种更“实用”的方式(与命令式风格相反)来构造我的代码,以便在多个try成功后加入它们

我想独立地尝试每个输入,目的是获得尽可能多的错误信息-我不想在遇到第一个错误时停止(因此
orElse()
等不会起作用)。但一旦不再发现错误,我想做一些涉及所有输入的进一步工作

我当前的代码如下(适当匿名):

Try amountTry=Try.of(this::readNumber)
.map(BigDecimal::valueOf)
.onFailure(此::collectError);
Try currencyTry=Try.of(this::readString)
.map(currency->currencyLookup(currency.class,currency))
.onFailure(此::collectError);
if(amountTry.issucess()&¤cyTry.issucess()){
sale.setAmount(amountTry.get(),currencyTry.get())的Amount.of;
}

你能推荐一种模式来用编程的函数风格的更多东西来替换
if()
吗?

你正在寻找的Javaslang/Vavr结构是for-construction结构,它可以通过
API.for
方法访问

import javaslang.control.Try;
import static javaslang.API.For;
...

For(amountTry, currencyTry)
    .yield(Amount::of)
    .forEach(sale::setAmount);
也就是说,如果
amountTry
currencyTry
都非空,它将通过在两个Iterable的叉积上生成一个结果值,并通过调用
使用者对每个结果元素执行一个操作来创建一个
Iterable
。如果有助于您更好地理解lambda表单中的显式输入类型,则以下内容与lambda表单中的内容相同:

For(amountTry, currencyTry)
    .yield((BigDecimal amount, Currency currency) -> Amount.of(amount, currency))
    .forEach((Amount amount) -> sale.setAmount(amount));
该库的更高版本具有用于理解
Try
的重载,它将返回一个
Try
实例,而不是
Iterable
,如果您想留在
Try
域中,这将使API变得更好