2014-10-02 15 views
11

द्वारा फ़िल्टर संग्रह मैं एक Set<String> usernames और List<Player> playersजावा 8 लैम्ब्डा - एक और संग्रह

मैं उन खिलाड़ियों है कि समूह में नहीं हैं को फ़िल्टर करना चाहते हैं।

मैं कैसे वेनिला पूर्व जावा 8

List<Player> distinctPlayers = new ArrayList<Player>(); 

for(Player p : players) { 
    if(!usernames.contains(p.getUsername()) distinctPlayers.add(p); 
} 

मैं एक लैम्ब्डा अभिव्यक्ति के साथ इस सरल कोड लिखने की कोशिश कर रहा हूँ में यह करने के लिए पता है, लेकिन मैं एक फिल्टर में काम करने के usernames.contains() पाने के लिए संघर्ष कर रहा हूँ

players.stream().filter(!usernames.contains(p -> p.getUsername())) 
.collect(Collectors.toList()); 

यह संकलित नहीं करता है। "नहीं किया जा सकता resove विधि getUsername()"

उत्तर

24

तुम गलत जगह में लैम्ब्डा अभिव्यक्ति मिल गया है - filter को तर्क की पूरी लैम्ब्डा अभिव्यक्ति होना चाहिए। दूसरे शब्दों में, "एक खिलाड़ी को p दिया गया, क्या मुझे इसे फ़िल्टर करना चाहिए या नहीं?"

players.stream().filter(p -> !usernames.contains(p.getUsername())) 
+2

बुलॉक्स! मुझे पता था कि मुझे कुछ आसान याद आया था। धन्यवाद! #feelsAshamed –

+0

अच्छा! धन्यवाद! ~ –

+0

नमस्ते, मैं एक्स्टैक्ट परिदृश्य का उपयोग कर रहा हूं, लेकिन यह संकलन त्रुटि दिखाता है "एक संलग्न क्षेत्र में परिभाषित" स्थानीय चर "उपयोगकर्ता नाम अंतिम या प्रभावी रूप से अंतिम होना चाहिए" –

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