2016-03-24 7 views
13

मैं किसी अन्य विधि संदर्भ के आधार पर एक विधि संदर्भ का उपयोग करना चाहता हूं। यह एक तरह से कठिन समझाने के लिए है, तो मैं आपको एक उदाहरण देता हूँ:java8: किसी अन्य विधि संदर्भ से विधि संदर्भ

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; 
    } 
} 

Person रों की एक सूची को देखते हुए, मैं की एक सूची प्राप्त करने के लिए विधि संदर्भ का उपयोग करना चाहते हैं उनके भाई की उम्र। मैं जानता हूँ कि यह इस तरह किया जा सकता है:

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

लेकिन अगर यह इसे इस तरह अधिक करने के लिए संभव है मैं सोच रहा हूँ:

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

यह इस उदाहरण में बहुत उपयोगी नहीं, मैं सिर्फ करना चाहते है पता है कि क्या संभव है।

+6

[मानचित्र विधि संदर्भों की श्रृंखला] (http://stackoverflow.com/questions/26920866/chain-of-map-method-references) – rgettman

उत्तर

13

आप उस मामले में दो map संचालन उपयोग करने की आवश्यकता:

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

पहले एक अपने भाई को Person नक्शे और दूसरा एक नक्शे अपनी उम्र के लिए Person

2

आप Functions.chain()Eclipse Collections से श्रृंखला विधि संदर्भ के लिए उपयोग कर सकते हैं:

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

आप से List

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

रोस्टर बदल नहीं सकते हैं के बाद से उम्र एक int है, तो आप का उपयोग करके मुक्केबाजी से बच सकते हैं एक IntList:

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

नोट: मैं ग्रहण संग्रह में योगदानकर्ता हूं।

1

फ़ंक्शन का उपयोग करें। और फिर, और संभावित रूप से कॉल में अपना पहला विधि संदर्भ लपेटें, या कास्ट करें।

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

roster.collect(ofFunction(Person::getSibling).andThen(Person::getAge)); 
संबंधित मुद्दे