Abaixo, continuamos a mergulhar no modelo de programação funcional java8
classe pública Test1 {public static void main (string [] args) {list <Teger> list = Arrays.asList (1,2,3,4,5,6,7,8,9,10); list.ForEach (novo consumidor <Teger> () {@Override public void aceite (número inteiro) {System.out.println (Integer);}}); }}Este programa é simples, primeiro inicialize uma coleção de tipo inteiro e depois emite cada elemento para o console. Entre eles, notamos o método foreach, que é o método padrão recém -adicionado no Java 8.
interface pública iterable <T> {. . omitir. Void padrão foreach (consumidor <? super t> ação) {objects.requirenOnnull (ação); for (t t: this) {action.accept (t); }}}É declarado na interface iterável e é modificado pelo padrão da palavra -chave. Dessa forma, qualquer subtipo dessa interface pode herdar a implementação do método foreach, portanto a interface da lista é uma subinterface indireta do iterável, portanto também herda o método padrão. O Java8 adota essa maneira inteligente de estender as funções da interface e é compatível com a versão antiga.
Em seguida, analisamos a implementação do foreach. Primeiro, recebemos uma ação de parâmetro do tipo de consumidor, realizamos julgamento não vazio e, em seguida, atravessamos todos os elementos atuais e os entregam ao método de aceitação da ação para o processamento. Então, o que diabos é o consumidor? Olhe para o código -fonte
@FunctionInterfacePublic Interface Consumer <T> { /*** executa esta operação no argumento fornecido. * * @param t O argumento de entrada */ void aceita (t t); . .Omited.} Uma interface, com apenas um método abstrato, é modificado por @functionalInterface, uma interface funcional típica.
Ok, agora sabemos que o parâmetro do tipo de consumidor recebido por foreach é uma interface funcional. O único método abstrato aceita na interface recebe um parâmetro e não retorna um valor. No artigo anterior, sabemos que uma das maneiras de criar instâncias de tipos de interface funcional é usar expressões Lambda, para que você possa transformar o programa principal.
classe pública Test1 {public static void main (string [] args) {list <Teger> list = Arrays.asList (1,2,3,4,5,6,7,8,9,10); // A expressão lambda recebe um parâmetro sem retornar a lista de valores.foreach (item -> system.out.println (item)); }} O item de expressão lambda -> system.out.println (item) recebe um parâmetro sem retornar um valor e atende aos requisitos de assinatura do método de aceitação e é compilado e passado.
Ou seja, se uma expressão de lambda for usada para criar uma instância de interface funcional, os parâmetros de entrada e o retorno dessa expressão lambda devem estar em conformidade com a assinatura do método do único método abstrato nessa interface funcional.
Em seguida, o programa será modificado
classe pública Test1 {public static void main (string [] args) {list <Teger> list = Arrays.asList (1,2,3,4,5,6,7,8,9,10); // List de referência do método.ForEach (System.out :: println); }} Eu vi dois dois pontos por trás, mas estava em uma bagunça de qualquer maneira. . . Esta é a segunda maneira de criar uma instância da interface funcional: Método Referência de referência Sintaxe é objeto :: nome do método
Da mesma forma, o uso do método de referência do método para criar instâncias de interface funcional também deve cumprir a definição de assinatura do método. Veja o código -fonte do método println aqui
public void println (objeto x) {string s = string.valueof (x); sincronizado (this) {impressão (s); newline (); }} Receba um parâmetro e não retorna o valor e compile -o.
Por fim, vamos dar uma olhada no último tipo de criação de uma interface funcional. O terceiro método: Construa referência do método e continue a modificar o programa.
classe pública Test1 {public static void main (string [] args) {list <Teger> list = Arrays.asList (1,2,3,4,5,6,7,8,9,10); // Lista de referência do método construtor.ForEach (test1 :: new); } Test1 (número inteiro i) {System.out.println (i); }} A sintaxe mencionada pelo construtor é: nome da classe :: novo
Adicionamos um novo construtor ao teste1, que recebe um parâmetro, não retorna um valor e compila. (Para mostrar apenas o uso de citações do construtor)
Com base no artigo anterior, podemos resumir três maneiras de criar tipos de interface funcionais:
1. Expressão lambda
2. Citação do método
3. Referência do método construtor
Nota: Não importa qual método, a assinatura do método deve estar alinhada com o método abstrato.