以下のコードでは、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) {...}
コードをリファクタリングし、 'InputStreamCallback'をある種の関数型に変更し、その関数を結果にマップし、マッピングされた結果を返すか、可変リストを使用してvavrリストの代わりに結果を収集する必要があります。不変なコレクションは、使用しようとしているユースケースには適していません。また、あなたの 'points'リストを' AtomicReference'でラップし、 'ref.set(...) 'で参照を更新することもできますが、それはかなり醜いハックでもあります。 –
RemoteFileTemplateクラスがSpringフレームワークの一部であるため、InputStreamCallbackをリファクタリングできません。私が思いついたものはすべて醜いので、今はjava.utilの可変コレクションに切り替えました – skippy
さて、春のAPIはあなたに可変性を強制します。変更可能なコレクションはこの場合に行く方法です、 'AtomicReference'はもっと醜いでしょう。 –