Vavr似乎解决了我的一个问题,一些方法进行了大量检查,并返回CalculationError或CalculationResult。
Either<CalculationError, CalculationResult> calculate (CalculationData calculationData) {
// either returns Either.left(new CalculationError()) or Either.right(new CalculationResult())
}
我有一个存储错误和结果的包装器
class Calculation {
List<CalculationResult> calculationResults;
List<CalculationError> calculationErrors;
}
是否有任何简洁的解决方案来转换来自集合的流
好吧,你正在使用vavr,所以“整洁”是正确的。当你使用的工具对语言的惯用形式怀有敌意时,往往会发生这种情况。但是,“整洁”是一个模糊的术语,没有明确的定义,所以,我想,无论你认为什么是“整洁”,都是“整洁”。整洁,嗯?
要么本身具有序列
方法-但它们都以要么应该工作的方式工作:它们是左偏的,因为任何存在的Lefts都被视为错误条件,这意味着如果您的Eithers之一是左,则所有右值都将被丢弃。因此,您不能使用序列
方法中的任何一个让要么本身为您烘焙右值列表。即使序列右
也不会为您执行此操作(它会在列表中的第一个左处停止并返回该值)。同样,过滤器也不是这样工作的——如果你打开字典,从这个词的含义来看,“要么非常”并不是真正的“要么”:它的意思不是:两种类型的同质混合。它只是对异常管理的一种非java式的理解:右包含“答案”,左包含“错误”(你使用它是正确的),但因此,“要么API”中没有任何东西可以帮助完成这项任务——它实际上涉及“请过滤掉错误,然后做某事”(“静默忽略错误”很少是正确的做法。这是这里所需要的,但这是有道理的,要么API不会给你一把脚踏枪。即使你在这里需要它)。
因此,我们只需简单地编写jane java:
var calculation = new Calculation();
for (var e : mix) {
if (e.isLeft()) calculation.calculationErrors.add(e.getLeft());
if (e.isRight()) calculation.calculationResult.add(e.getRight());
}
(这假定您的计算构造函数至少将这些列表初始化为空可变项)。
注:罗布·斯波尔的回答也假设了这一点,而且要长得多。有时功能性的方式是愚蠢、缓慢、笨拙、难以阅读的方式。
NB2:Either.sequence(混合). orElseRun(s-
这可以使用自定义收集器轻松完成。用一位伪代码表示
Collector<Either<CalculationError, CalculationResult>, ?, Calculation> collector = Collector.of(
Calculation::new,
(calc, either) -> {
if (either has error) {
calc.calculationErrors.add(either.error);
} else {
calc.calculationResults.add(either.result);
}
},
(calc1, calc2) -> {
calc1.calculationErrors.addAll(calc2.calculationErrors);
calc1.calculationResults.addAll(calc2.calculationResults);
return calc1;
}
);
Calculation calc = data.stream()
.map(this::calculate)
.collect(collector);
请注意,Compation
应该初始化它的两个列表(在声明或新构造函数中)。
问题内容: 我已经编写了此函数,用于将元组列表转换为列表列表。有没有更优雅的/ Pythonic的方式来做到这一点? 问题答案: 您可以使用列表推导:
问题内容: 现在,我想创建一个新列表,其中包含中的所有值。这里的结果应该包含 问题答案: 使用以下方法尝试:
问题内容: 将a 转换为同时保持Queue顺序的最快方法是什么? 问题答案: 最快的方法是首先使用LinkedList,它可用作列表或队列。 否则您需要复印 注意:处理PriorityQueue时,请使用循环,轮询每个元素并添加到列表中。要列出的PriorityQueue不维护堆顺序。
问题内容: 我如何转换 至 问题答案: 使用简单的列表理解: 会给你:
我有一个lambda表达式,我想在其中创建一个对象列表,但我得到了错误 错误 我希望作为lambda表达式的返回类型。我怎样才能做到呢?
我正在尝试将列表的元组转换为列表,但是我没有成功,所以我有了这个函数 获取输入,例如: ( [1,2,3,4], [7,8,9] ) 并应返回: [1,7,2,8,3,9,4] 我有 结果是: [1,7,2,8,3,9***异常:hw2.hs:29: 1-54:函数函数中的非穷尽模式 我知道我得到这个错误,因为列表是不一样的大小,你们怎么认为我可以解决这个问题