1

鉴于下面的代码片段,我将如何使用 Vavr 不可变列表或流?我不能作为局部变量,因为无法将其标记为最终变量。我不想晋升List<CurvePoint> points为班员。

import io.vavr.collection.List;

private RemoteFileTemplate template;

public <T> List<T> loadObjects(Class<T> type, InputStream stream) {...}

public List<CurvePoint> getCurvePoints(String path, FTPFile file) {
    final List<CurvePoint> points = List.empty();
    template.get(path + "/" + file.getName(), s -> {
        // The final local variable points cannot be assigned. It must be blank and not using a compound assignment
        points = points.appendAll(loadObjects(CurvePoint.class, s));
    });

    return points;
}

public class RemoteFileTemplate<F> implements RemoteFileOperations<F>, InitializingBean, BeanFactoryAware {
    public boolean get(final String remotePath, final InputStreamCallback callback) {...}
4

1 回答 1

1

这是void doStuff(Callback<Whatever> callback)语法的问题:难以进行单元测试,并且将发射器(RemoteFileTemplate)与消费者(回调代码)紧密耦合。

如果不是签名,CompletableFuture<Whatever> doStuff()那么您可以自由编写不可变代码(使用 Vavr 或其他任何东西)。然后,您可以本着return List.ofAll(template.get(path + "/" + file.getName()).get())同步代码或return template.get(path + "/" + file.getName()).thenApply(List::ofAll)异步代码的精神编写一些东西。

于 2017-12-13T22:00:27.900 回答