Como um programador não Java que está aprendendo Java, estou lendo sobre interfaces Supplier
e Consumer
no momento. E não consigo entender seu uso e significado. Quando e por que você usaria essas interfaces? Alguém pode me dar um exemplo simples de um leigo disso ... Estou achando os exemplos do Doc não sucintos o suficiente para o meu entendimento.
99
Consumer
eSupplier
também pode pesquisar o tutorial paraConsumer
...Respostas:
Este é o fornecedor:
Este é o consumidor:
Portanto, em termos leigos, um fornecedor é um método que retorna algum valor (como em seu valor de retorno). Considerando que, um consumidor é um método que consome algum valor (como no argumento do método) e executa algumas operações sobre eles.
Eles se transformarão em algo assim:
Quanto ao uso, o exemplo básico seria:
Stream#forEach(Consumer)
método. É necessário um Consumidor, que consome o elemento do fluxo no qual você está iterando, e executa alguma ação em cada um deles. Provavelmente imprimi-los.fonte
A razão pela qual você está tendo dificuldade em entender o significado de interfaces funcionais como aquelas em
java.util.function
é que as interfaces definidas aqui não têm nenhum significado! Eles estão presentes principalmente para representar a estrutura , não a semântica .Isso é atípico para a maioria das APIs Java. A API Java típica, como uma classe ou interface, tem significado, e você pode desenvolver um modelo mental para o que ela representa e usar isso para entender as operações nela. Considere,
java.util.List
por exemplo. AList
é um contêiner de outros objetos. Eles têm uma sequência e um índice. O número de objetos contidos na lista é retornado porsize()
. Cada objeto possui um índice no intervalo 0..size-1 (inclusive). O objeto no índice i pode ser recuperado chamandolist.get(i)
. E assim por diante.As interfaces funcionais em
java.util.function
não têm esse significado. Em vez disso, são interfaces que meramente representam a estrutura de uma função, como o número de argumentos, o número de valores de retorno e (às vezes) se um argumento ou valor de retorno é um primitivo. Assim, temos algo comoFunction<T,R>
o que representa uma função que leva um único argumento do tipo T e retorna um valor do tipo R . É isso aí. O que essa função faz? Bem, ele pode fazer qualquer coisa ... desde que tenha um único argumento e retorne um único valor. É por isso que a especificação paraFunction<T,R>
é pouco mais do que "Representa uma função que aceita um argumento e produz um resultado."Claramente, quando estamos escrevendo um código, ele tem um significado, e esse significado deve vir de algum lugar. No caso das interfaces funcionais, o significado vem do contexto em que são usadas. A interface
Function<T,R>
não tem significado isoladamente. No entanto, najava.util.Map<K,V>
API, existe o seguinte:(curingas elididos por brevidade)
Ah, esse uso de
Function
é uma "função de mapeamento". O que isso faz? Nesse contexto, sekey
ainda não estiver presente no mapa, a função de mapeamento é chamada e recebe a chave e espera-se que produza um valor, e o par chave-valor resultante é inserido no mapa.Portanto, você não pode olhar para a especificação
Function
(ou qualquer uma das outras interfaces funcionais, por falar nisso) e tentar discernir o que elas significam. Você precisa ver onde eles são usados em outras APIs para entender o que significam, e esse significado se aplica apenas a esse contexto.fonte
A
Supplier
é qualquer método que não aceita argumentos e retorna um valor. Seu trabalho é literalmente fornecer uma instância de uma classe esperada. Por exemplo, toda referência a um método 'getter' é umSupplier
Sua referência de método de instância
myClass::getCount
é uma instância deSupplier<Integer>
.A
Consumer
é qualquer método que aceita argumentos e não retorna nada. É invocado por seus efeitos colaterais. Em termos de Java, aConsumer
é uma expressão idiomática para umvoid
método. Os métodos 'setter' são um bom exemplo:Sua referência de método de instância
myClass::setCount
é uma instância deConsumer<Integer>
eIntConsumer
.A
Function<A,B>
é qualquer método que recebe um argumento de um tipo e retorna outro. Isso pode ser referido como uma 'transformação'. OFunction<A,B>
recebe umA
e retorna umB
. É notável que, para um determinado valor deA
, a função sempre deve retornar um valor específico deB
.A
eB
pode, na verdade, ser do mesmo tipo, como o seguinte:Sua referência de método de instância
myClass:addTwo
é aeFunction<Integer, Integer>
aToIntFunction<Integer>
.Uma referência ao método Class para um getter é outro exemplo de uma função.
Sua referência de método de classe
MyClass::getCount
é uma instância deFunction<MyClass,Integer>
eToIntFunction<MyClass>
.fonte
Por que o Consumidor / Fornecedor / outras interfaces funcionais são definidas no pacote java.util.function : Consumidor e Fornecedor são duas, entre muitas, das interfaces funcionais integradas fornecidas em Java 8. O objetivo de todas essas interfaces funcionais integradas é para fornecer um "modelo" pronto para interfaces funcionais com descritores de função comuns (assinaturas / definições de métodos funcionais).
Digamos que temos um requisito para converter um tipo T em outro tipo R. Se passássemos qualquer função definida assim como um parâmetro para um método, então esse método precisaria definir uma Interface Funcional cujo método funcional / abstrato receba parâmetro do tipo T como entrada e fornece um parâmetro do tipo R como saída. Agora, poderia haver muitos cenários como este e o (s) programador (es) acabariam definindo várias interfaces funcionais para suas necessidades. Para evitar esse tipo de cenário, facilite a programação e traga um padrão comum no uso de interfaces funcionais, um conjunto de interfaces funcionais embutidas como Predicado, Função, Consumidor e Fornecedor foram definidas.
O que o consumidor faz : a interface funcional do consumidor aceita uma entrada, faz algo com essa entrada e não fornece nenhuma saída. Sua definição é assim (da fonte Java) -
Aqui, accept () é o método funcional \ abstrato que recebe uma entrada e não retorna nenhuma saída. Portanto, se você quiser inserir um Inteiro, faça algo com ele sem saída e, em vez de definir sua própria interface, use uma instância de Consumidor.
O que o fornecedor faz : a interface funcional do fornecedor não recebe nenhuma entrada, mas retorna uma saída. É definido assim (da fonte Java) -
Sempre que você precisar de uma função que retorna algo, digamos um inteiro, mas não leva nenhuma saída, use uma instância de Fornecedor.
Caso seja necessária mais clareza, junto com o uso de exemplo, das interfaces de consumidor e fornecedor, você pode consultar minhas postagens de blog sobre as mesmas - http://www.javabrahman.com/java-8/java-8-java-util- function-consumer-tutorial-with-examples / e http://www.javabrahman.com/java-8/java-8-java-util-function-supplier-tutorial-with-examples/
fonte
1. Significado
Veja minhas respostas à minha pergunta aqui e também a outra aqui , mas em resumo essas novas interfaces fornecem convenção e descritividade para que todos possam usar (+ encadeamento de métodos funky como
.forEach(someMethod().andThen(otherMethod()))
2. Diferenças
Consumidor : pega algo, faz algo, não retorna nada:
void accept(T t)
Fornecedor: não leva nada, retorna algo:
T get()
(reverso do Consumidor, basicamente um método 'getter' universal)3. Uso
Fornecedor: embrulhe código repetitivo, por exemplo, tempo de execução de código
fonte
Em termos de leigos,
o fornecedor fornecerá dados, mas sem consumir nenhum dado. Em termos de programação, um método que não aceita nenhum argumento, mas retorna um valor. É usado para gerar novos valores.
http://codedestine.com/java-8-supplier-interface/
o consumidor consumirá dados e não retornará nenhum dado. Em termos de programação, um método que recebe vários argumentos e não retorna nenhum valor.
http://codedestine.com/java-8-consumer-interface/
fonte
Consumidor e fornecedor são as interfaces fornecidas por java. O consumidor é usado para iterar sobre os elementos da lista e o fornecedor é usado para o objeto de fornecimento
você pode entender facilmente com demonstração de código.
Consumidor
Fornecedor
fonte
A resposta mais simples pode ser:
Um consumidor pode ser visto como uma função <T, vazio>. Um Fornecedor pode ser visto como uma Função <Vazio, T>.
fonte
Em resumo,
representa uma função anônima que não aceita nenhum argumento e produz um resultado.
representa uma função anônima que aceita um argumento e não produz nenhum resultado.
Além disso, existe um predicado . Predicado representa uma função anônima que aceita um argumento e produz um resultado.
fonte