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. A List
é um contêiner de outros objetos. Eles têm uma sequência e um índice. O número de objetos contidos na lista é retornado por size()
. Cada objeto possui um índice no intervalo 0..size-1 (inclusive). O objeto no índice i pode ser recuperado chamando list.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 como Function<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 para Function<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, na java.util.Map<K,V>
API, existe o seguinte:
V computeIfAbsent(K key, Function<K,V> mappingFunction)
(curingas elididos por brevidade)
Ah, esse uso de Function
é uma "função de mapeamento". O que isso faz? Nesse contexto, se key
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.
Consumer
eSupplier
também pode pesquisar o tutorial paraConsumer
...