Método anônimo

Boa noite Pessoal,
Estou fazendo algumas coisas com o Spark e me deparei com o código new Function<String, String>, na verdade não sei como fazer a busca na internet. Alguém poderia me ajudar em mais informações e saber o que é feito dessa forma ?

JavaRDD dataSchemaRdd = dataSchema.map(new Function<String, String>() {
private static final long serialVersionUID = 1L;

		   @Override
		    public String call(String row) throws Exception {
		    	   return row.replaceAll("\r\n", " ");
		    }
		});

Muito obrigado!

Nesta parte vc está criando uma classe anônima.

Mas onde está o nome da classe ? Pode se criar qualquer classe ? Porque devemos criar uma classe anônima ao invés de uma classe normal ?

Normalmente você deve declarar uma classe antes de instanciá-la. Classes anônimas são declaradas e instanciadas ao mesmo tempo.

O código que mostrou é equivalente a isso:

class MyFunction implements Function<String, String> {
    private static final long serialVersionUID = 1L;

    @Override
    public String call(String row) throws Exception {
         return row.replaceAll("\r\n", " ");
    }
}

JavaRDD dataSchemaRdd = dataSchema.map(new MyFunction());

Se MyFunction só será usada uma vez em todo meu programa, não faz sentido eu declará-la. Muito melhor usar a versão anônima.

Este é o ponto, ela não tem nome, é anônima!

Tecnicamente, uma classe anônima sempre está implementando uma interface ou extendendo uma classe.

Ou seja, classes anônimas devem ter como base uma interface ou classe previamente declarada.

Você pode criar classes anônimas a partir de qualquer interface ou apartir de qualquer classe que não seja declarada final.

public class Program {
    static class C {}
    interface I {}
    static final class FC {}
    
    public static void main(String[] args) {
        C c = new C() {}; // criando apartir de uma classe
        I i = new I() {}; // criando apartir de uma interface
        FC fc = new FC() {}; // isso dá erro, FC é final        
    }
}

Acredito que o principal motivo seja praticidade. É como eu disse lá em cima, se uma certa função será usada apenas uma vez no programa todo, pra quê perder tempo a declarando? Melhor usar uma anônima.

Para saber mais:

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

https://docs.oracle.com/javase/specs/jls/se10/html/jls-15.html#jls-15.9.5