私は Java 8 を学習している途中で、少し奇妙なことに出くわしました。
次のスニペットを検討してください。
private MyDaoClass myDao;
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map((input) -> transformer.transformRelationship(input))
.collect(Collectors.toSet())
);
}
基本的に、relationships
使用している DAO の API に準拠するために、呼び出された入力セットを別の型にマップする必要があります。RelationshipTransformerImpl
変換には、ローカル変数としてインスタンス化する既存のクラスを使用したいと思います。
さて、ここに私の質問があります:
上記のコードを次のように変更するとします。
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map((input) -> transformer.transformRelationship(input))
.collect(Collectors.toSet())
);
transformer = null; //setting the value of an effectively final variable
}
transformer
ローカル変数が「事実上最終」ではないため、明らかにコンパイルエラーが発生します。ただし、ラムダをメソッド参照に置き換えると、次のようになります。
public void storeRelationships(Set<Relationship<ClassA, ClassB>> relationships) {
RelationshipTransformer transformer = new RelationshipTransformerImpl();
myDao.createRelationships(
relationships.stream()
.map(transformer::transformRelationship)
.collect(Collectors.toSet())
);
transformer = null; //setting the value of an effectively final variable
}
その後、コンパイルエラーが発生しなくなりました!なぜこれが起こるのですか?ラムダ式を記述する 2 つの方法は同等であるはずだと思いましたが、明らかにそれ以上のことが起こっています。