Eu preciso de uma função de mapa . Já existe algo assim em Java?
(Para aqueles que se perguntam: é claro que sei como implementar essa função trivial ...)
java
map-function
Albert
fonte
fonte
Respostas:
Não há noção de uma função no JDK a partir do java 6.
A goiaba possui uma interface Function e o método fornece a funcionalidade que você precisa.
Collections2.transform(Collection<E>, Function<E,E2>)
Exemplo:
Resultado:
Hoje em dia, com o Java 8, existe na verdade uma função de mapa, então eu provavelmente escreveria o código de uma maneira mais concisa:
fonte
Collections2.transform(input -> Integer.toHexString(intput.intValue())
Desde o Java 8, existem algumas opções padrão para fazer isso no JDK:
Veja
java.util.Collection.stream()
ejava.util.stream.Collectors.toList()
.fonte
toList()
. Substituindo para outro tipo:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
ser substituído por apenasdoMap
?foo::doMap
ouFoo::doMap
.Existe uma biblioteca maravilhosa chamada Java funcional que lida com muitas das coisas que você gostaria que o Java tivesse, mas não. Por outro lado, também há esta maravilhosa linguagem Scala, que faz tudo o que Java deveria ter feito, mas ainda não é compatível com qualquer coisa escrita para a JVM.
fonte
a.map({int i => i + 42});
eles estenderam o compilador? ou pré-processador adicionado?Tenha muito cuidado com a
Collections2.transform()
goiaba. A maior vantagem desse método também é seu maior perigo: sua preguiça.Veja a documentação da
Lists.transform()
qual acredito que também se aplica aCollections2.transform()
:Também na documentação
Collections2.transform()
mencionada, você obtém uma visualização ao vivo, que a mudança na lista de fontes afeta a lista transformada. Esse tipo de comportamento pode levar a problemas difíceis de rastrear se o desenvolvedor não perceber o modo como funciona.Se você deseja um "mapa" mais clássico, que será executado uma vez e apenas uma vez, é melhor usar
FluentIterable
também o Guava, que possui uma operação muito mais simples. Aqui está o exemplo do google para isso:transform()
aqui está o método do mapa. Ele usa a mesma função <> "retornos de chamada" queCollections.transform()
. A lista que você voltar é somente leitura, usecopyInto()
para obter uma lista de leitura e gravação.Caso contrário, é claro que quando o java8 sair com lambdas, isso será obsoleto.
fonte
Esta é outra biblioteca funcional com a qual você pode usar o mapa: http://code.google.com/p/totallylazy/
fonte
Mesmo que seja uma pergunta antiga, gostaria de mostrar outra solução:
Basta definir sua própria operação usando java generics e java 8 streams:
Então você pode escrever um código como este:
fonte