2016-03-24 10 views
13

Desidero utilizzare un riferimento al metodo basato su un altro riferimento al metodo. È un po 'difficile da spiegare, quindi ti darò un esempio:java8: riferimento metodo da un altro metodo riferimento

Person.java

public class Person{ 
    Person sibling; 
    int age; 

    public Person(int age){ 
     this.age = age; 
    } 

    public void setSibling(Person p){ 
     this.sibling = p; 
    } 

    public Person getSibling(){ 
     return sibling; 
    } 

    public int getAge(){ 
     return age; 
    } 
} 

Dato un elenco di Person s, mi vuole usare il metodo riferimenti per ottenere un elenco di l'età dei loro fratelli. So che questo può essere fatto in questo modo:

roster.stream().map(p -> p.getSibling().getAge()).collect(Collectors.toList()); 

ma mi chiedo se è possibile farlo più simile a questo:

roster.stream().map(Person::getSibling::getAge).collect(Collectors.toList()); 

non è terribilmente utile in questo esempio, voglio solo sapere cosa è possibile

+6

[Riferimenti del metodo Chain of Map] (http://stackoverflow.com/questions/26920866/chain-of-map-method-references) – rgettman

risposta

13

È necessario utilizzare due map operazioni in quel caso:

roster.stream().map(Person::getSibling).map(Person::getAge).collect(Collectors.toList()); 

La prima mappa la Person al suo fratello e la seconda mappa il Person per la sua età.

2

È possibile utilizzare Functions.chain() da Eclipse Collections al Metodo catena riferimenti:

MutableList<Person> roster = Lists.mutable.empty(); 
MutableList<Integer> ages = 
    roster.collect(Functions.chain(Person::getSibling, Person::getAge)); 

Se non è possibile cambiare roster da List

List<Person> roster = Lists.mutable.empty(); 
List<Integer> ages = 
    ListAdapter.adapt(roster).collect(Functions.chain(Person::getSibling, Person::getAge)); 

Poiché l'età è un int, è possibile evitare la boxe utilizzando un IntList:

MutableList<Person> roster = Lists.mutable.empty(); 
IntList ages = roster.collectInt(Functions.chainInt(Person::getSibling, Person::getAge)); 

Nota: contribuisco alle raccolte Eclipse.

1

Utilizzare Function.andThen e, eventualmente, avvolgere il primo riferimento al metodo in una chiamata o eseguire il cast.

public static <V, R> Function<V,R> ofFunction(Function<V,R> function) { 
    return function; 
} 

roster.collect(ofFunction(Person::getSibling).andThen(Person::getAge));