Lambda Yerel Değişkene Erişebilir
Ancak bu değişken "effectively final" olmalı. Açıklaması şöyle.
Any local variable, formal parameter, or exception parameter used but not declared in a lambda expression must either be declared final or be effectively final (§4.12.4), or a compile-time error occurs where the use is attempted.
Örnek
Şu kod derlenmez. Çünkü lambda içinde yerel değişken değiştiriliyor.int ordinal = 0;
list.forEach(s -> {
...
ordinal++;
});
Örnek
Şu kod derlenmez. Çünkü lambda içinde yerel değişken değiştiriliyor.int sum = 0;
list.forEach(e -> { sum += e.size(); });
Aynı Kısıtlama Instance Member İçin Geçerli Değil
Açıklaması şöyle
Yerel Değişken Capture Ediliyorsa Her Seferinde Yeni Lambda Instance YaratılırThere's a simple, straightforward answer to why instance variables can always be captured: this is always effectively final. That is, there is always one known fixed object at the time of the creation of a lambda accessing an instance variable
Açıklaması şöyle
Simply said, if a lambda expression does not capture values, it will be a singleton that is re-used on every invocation.
Hiç yorum yok:
Yorum Gönder