2017-12-12 5 views
1

以下のコードでは、Vavr不変リストまたはストリームはどのように使用しますか?私はそれを最終的なものにする方法がないので、ローカル変数としてはできません。私は、クラスメンバーにList<CurvePoint> pointsを宣伝したくありません。Java 8ラムダ内でのローカルVavr不変コレクションの使用

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) {...} 
+0

コードをリファクタリングし、 'InputStreamCallback'をある種の関数型に変更し、その関数を結果にマップし、マッピングされた結果を返すか、可変リストを使用してvavrリストの代わりに結果を収集する必要があります。不変なコレクションは、使用しようとしているユースケースには適していません。また、あなたの 'points'リストを' AtomicReference'でラップし、 'ref.set(...) 'で参照を更新することもできますが、それはかなり醜いハックでもあります。 –

+0

RemoteFileTemplateクラスがSpringフレームワークの一部であるため、InputStreamCallbackをリファクタリングできません。私が思いついたものはすべて醜いので、今はjava.utilの可変コレクションに切り替えました – skippy

+0

さて、春のAPIはあなたに可変性を強制します。変更可能なコレクションはこの場合に行く方法です、 'AtomicReference'はもっと醜いでしょう。 –

答えて

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)と書くことができます。

関連する問題