Java Pro Tips: Truques raros para sobrecarregar sua programação

Mar 13 2023
Descubra técnicas raras e poderosas para melhorar seu código Java, desde a inicialização com colchetes duplos até classes opcionais e muito mais que é elegante e eficiente. De interfaces funcionais e referências de método à API de fluxo e classe opcional, abordaremos alguns dos recursos avançados do Java que geralmente são negligenciados, mas que podem melhorar significativamente sua experiência de programação.

Descubra técnicas raras e poderosas para melhorar seu código Java, desde a inicialização com colchetes duplos até classes opcionais e muito mais

Neste artigo, exploraremos algumas das raras e poderosas dicas e truques que podem ajudá-lo a liberar todo o potencial do Java e criar um código elegante e eficiente.

De interfaces funcionais e referências de método à API de fluxo e classe opcional, abordaremos alguns dos recursos avançados do Java que geralmente são negligenciados, mas que podem melhorar significativamente sua experiência de programação.

Então, vamos mergulhar e liberar todo o poder do Java!

Inicialização de chaves duplas

Essa técnica permite criar uma instância de uma classe e inicializar seus valores usando uma única instrução. Envolve a criação de uma classe interna anônima e o uso de um bloco inicializador de instância para inicializar as variáveis ​​de instância.

Map<String, String> myMap = new HashMap<String, String>() {{
   put("key1", "value1");
   put("key2", "value2");
}};

Esse recurso foi introduzido no Java 7 e permite usar sublinhados para separar grupos de dígitos em literais numéricos para melhor legibilidade.

int million = 1_000_000;
long creditCardNumber = 1234_5678_9012_3456L;
double pi = 3.14_15_92_65;

Esse recurso foi introduzido no Java 7 e permite fechar automaticamente recursos como fluxos, arquivos e conexões de banco de dados ao final de um bloco try, eliminando a necessidade de um bloco final.

try (FileInputStream fis = new FileInputStream("myfile.txt");
     BufferedInputStream bis = new BufferedInputStream(fis)) {
    // code that uses fis and bis
} catch (IOException e) {
    // handle exception
}

Você pode usar um enum em Java para implementar o padrão de design Singleton. Os valores de enum são instanciados apenas uma vez quando o enum é acessado pela primeira vez, tornando-o thread-safe.

public enum Singleton {
    INSTANCE;
 
    // methods and instance variables
}

As expressões lambda foram introduzidas no Java 8 e permitem que você escreva um código mais conciso e legível para construções de programação funcional, como fluxos e coleções.

List<String> names = Arrays.asList("John", "Mary", "Bob");
names.forEach(name -> System.out.println(name));

As interfaces funcionais são interfaces que possuem apenas um método abstrato e são usadas para definir expressões lambda. Você pode usar a @FunctionalInterfaceanotação para garantir que uma interface seja uma interface funcional e obter um erro de tempo de compilação se não for.

@FunctionalInterface
public interface MyInterface {
    void doSomething();
}

As referências de método permitem que você se refira a um método sem invocá-lo. Você pode usar o ::operador para criar uma referência de método. Existem quatro tipos de referências de método: estático, instância, construtor e instância arbitrária.

List<String> names = Arrays.asList("John", "Mary", "Bob");
names.forEach(System.out::println);

A Stream API é um recurso poderoso introduzido no Java 8 que permite processar coleções de dados de maneira funcional. Você pode usar uma variedade de operações, como filtrar, mapear, reduzir e coletar para processar os dados.

List<String> names = Arrays.asList("John", "Mary", "Bob");
long count = names.stream()
                 .filter(name -> name.length() < 4)
                 .count();

A classe Optional é usada para representar um valor que pode ou não estar presente. Você pode usar métodos como isPresent(), get()e orElse()para trabalhar com objetos opcionais.

Optional<String> name = Optional.ofNullable(getName());
if (name.isPresent()) {
    System.out.println("Hello, " + name.get());
} else {
    System.out.println("Hello, stranger");
}

O Diamond Operator permite que você omita os argumentos de tipo ao criar uma nova instância de uma classe genérica, desde que o tipo possa ser inferido a partir do contexto.

Map<String, List<String>> myMap = new HashMap<>();

Continue explorando, continue aprendendo e continue codificando!

Em minhas contas do Twitter e Instagram , frequentemente compartilho minha jornada de programação e experiências de desenvolvimento.

Obrigado por ler :)