Использование локальных неизменяемых коллекций Vavr внутри лямбды Java 8

Учитывая фрагмент кода ниже, как бы я использовал неизменяемые списки или потоки 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) {...}

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) для асинхронного кода.

Другие вопросы по тегам