DEV Community

Java Efetivo (livro)
Java Efetivo (livro)

Posted on

Item 43: Dê preferência às referências para métodos em vez dos lambdas

Vantagens das Referências para Métodos

  • Concisão: Referências para métodos são mais concisas que lambdas.
    Exemplo: Incrementar valor em um Map usando merge:

  • Lambda: (count, incr) -> count + incr
    Referência para método: Integer::sum

Redução de Boilerplate
Remoção de Parâmetros Inúteis: Parâmetros como count e incr são eliminados.
Exemplo:

map.merge(key, 1, Integer::sum);

Enter fullscreen mode Exit fullscreen mode

Uso Eficiente de Referências para Métodos

  • Documentação Útil em Lambdas: Em alguns casos, nomes de parâmetros em lambdas podem fornecer documentação útil.
  • Conversão de Lambdas para Métodos: Se um lambda for muito complexo, extrair o código para um método separado e usar a referência para esse método.

IDEs e Referências para Métodos

  • Sugestões de IDE: IDEs frequentemente sugerem substituição de lambdas por referências para métodos.
  • Aceitação das Sugestões: Geralmente, aceite as sugestões, mas avalie caso a caso.

Exceções e Considerações

  • Lambdas mais Concisos: Às vezes, lambdas são mais concisos que referências para métodos.
  • Exemplo com Classe:
  • Referência para método: GoshThisClassNameIsHumongous::action
  • Lambda: () -> action()
  • Função Identidade: Function.identity() vs. x -> x

Tipos de Referências para Métodos

  • Estática: Integer::parseInt (lambda: str -> Integer.parseInt(str))
  • Limitada: Instant.now()::isAfter (lambda: t -> Instant.now().isAfter(t))
  • Ilimitada: String::toLowerCase (lambda: str -> str.toLowerCase())
  • Construtor de Classe: TreeMap::new (lambda: () -> new TreeMap)
  • Construtor de Array: int[]::new (lambda: len -> new int[len])

Conclusão
Preferência pelas Referências para Métodos: Use referências para métodos quando forem mais curtas e claras que lambdas.
Uso de Lambdas: Prefira lambdas se eles forem mais concisos ou se fornecerem melhor documentação.

Image description

Top comments (0)