2014-10-26 18 views
28

ओह, उन मुश्किल जावा 8 स्ट्रीम लैम्बडास के साथ। वे बहुत शक्तिशाली हैं, फिर भी जटिलताएं इसके चारों ओर किसी के शीर्षलेख को लपेटने के लिए थोड़ा सा लेती हैं।जावा में संपत्ति द्वारा छंटनी 8 स्ट्रीम

मान लें कि मेरे पास User संपत्ति User.getName() है। मान लें कि मेरे पास उन उपयोगकर्ताओं का नक्शा है Map<String, User> नामों से जुड़े (उदाहरण के लिए उपयोगकर्ता नाम लॉगिन करें)। आइए आगे यह कहें कि मेरे पास उपयोगकर्ता नामों को सॉर्ट करने के लिए तुलनित्र UserNameComparator.INSTANCE का उदाहरण है (शायद फैंसी कोलेटर और ऐसे)।

तो मैं मानचित्र में उपयोगकर्ताओं की सूची कैसे प्राप्त करूं, उपयोगकर्ता नाम द्वारा क्रमबद्ध? मैं नक्शा कुंजी अनदेखा कर सकते हैं और ऐसा करते हैं:

return userMap.values() 
    .stream() 
    .sorted((u1, u2) -> { 
     return UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName()); 
    }) 
    .collect(Collectors.toList()); 

लेकिन उस लाइन जहां मैं नाम UserNameComparator.INSTANCE उपयोग करने के लिए निकालने के लिए है बहुत अधिक शारीरिक श्रम की तरह लगता है। क्या कोई तरीका है कि मैं आसानी से सॉर्टिंग के लिए User::getName कुछ मैपिंग फ़ंक्शन के रूप में आपूर्ति कर सकता हूं, और अभी भी एकत्रित सूची में User उदाहरण प्राप्त कर सकता हूं?

बोनस: क्या होगा यदि मैं जिस चीज को सॉर्ट करना चाहता था, वह दो स्तरों की गहराई थी, जैसे कि User.getProfile().getUsername()?

उत्तर

51

क्या आप चाहते हैं Comparator#comparing है:

userMap.values().stream() 
    .sorted(Comparator.comparing(User::getName, UserNameComparator.INSTANCE)) 
    .collect(Collectors.toList()); 

अपने प्रश्न के दूसरे भाग के लिए, तुम सिर्फ

Comparator.comparing(
    u->u.getProfile().getUsername(), 
    UserNameComparator.INSTANCE 
) 
+0

वाह का प्रयोग करेंगे, मेरे मस्तिष्क लगभग दर्द होता है, लेकिन है कि मैं वास्तव में क्या देख रहा था था बोनस और सब कुछ के लिए! और सुपर-त्वरित प्रतिक्रिया भी। धन्यवाद! –

संबंधित मुद्दे