Eu pensei que classes anônimas eram basicamente como lambdas, mas com sintaxe pior ... isso acaba sendo verdade, mas a sintaxe é ainda pior e faz com que (o que deveria ser) variáveis locais vazem na classe que o contém.
Você não pode acessar nenhuma variável final transformando-a em campos da classe pai.
Por exemplo
Interface:
public interface TextProcessor
{
public String Process(String text);
}
classe:
private String _key;
public String toJson()
{
TextProcessor textProcessor = new TextProcessor() {
@Override
public String Process(String text)
{
return _key + ":" + text;
}
};
JSONTypeProcessor typeProcessor = new JSONTypeProcessor(textProcessor);
foreach(String key : keys)
{
_key = key;
typeProcessor.doStuffThatUsesLambda();
}
Eu não sei se eles resolveram isso em java 8 (eu estou preso no mundo EE e ainda não tenho 8), mas em c # ficaria assim:
public string ToJson()
{
string key = null;
var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);
foreach (var theKey in keys)
{
key = theKey;
typeProcessor.doStuffThatUsesLambda();
}
}
Você não precisa de uma interface separada em c # também ... Eu sinto falta! Eu me pego criando designs piores em java e me repetindo mais porque a quantidade de código + complexidade que você precisa adicionar em java para reutilizar algo é pior do que apenas copiar e colar a maior parte do tempo.
final
variáveis locais a partir do método anexo.