2016-03-25 4 views
17

मुझे लगता है कि यह सी # जावा में ऐसा कैसे करना है।जावा 8 लैम्ब्डा अभिव्यक्ति का उपयोग कैसे करें एक प्रकार की सूची को अपने उप प्रकार की सूची में परिवर्तित करने के लिए

मेरे पास List<TypeX> है लेकिन मुझे पता है कि उस सूची में प्रत्येक तत्व वास्तव में TypeX का उप-वर्ग है TypeY पर कॉल किया गया।

मैं एक लैम्ब्डा अभिव्यक्ति कैसे लिख सकता हूं जो List<TypeX> स्वीकार करता है और List<TypeY> देता है?

+0

क्या आपने कुछ भी करने की कोशिश की है? – Reimeus

+0

अगर मैं ईमानदार नहीं हूं, तो भी मैं जावा के लैम्ब्डा सिंटैक्स को उठा रहा हूं। –

+0

क्या आप एक ही उदाहरण को एक अलग तरीके से (असुरक्षित) देखने की कोशिश कर रहे हैं या 3 उत्तरों (अब तक) में एक नई सूची बना रहे हैं? –

उत्तर

22

मेरी उदाहरण के लिए, मैं निम्नलिखित वर्गों का उपयोग करेगा:

final List<TypeX> xList = ... 

तुम सब TypeY.class.cast के लिए एक विधि संदर्भ का उपयोग करने की जरूरत है:

class TypeX {} 
class TypeY extends TypeX {} 

तो मैं एक List<TypeX> है

final List<TypeY> yList = xList.stream() 
           .map(TypeY.class::cast) 
           .collect(toList()); 

आप filter() पर भी कर सकते हैं

final List<TypeY> yList = xList.stream() 
           .filter(TypeY.class::isInstance) 
           .map(TypeY.class::cast) 
           .collect(toList()); 

उदाहरण का उपयोग करें::

List<TypeX> list = ...; 
List<TypeY> castList = 
    list.stream().map(x -> (TypeY)x).collect(Collectors.toList()); 
+5

मैं त्रुटियों को बाहर करने के लिए फ़िल्टर के कारण इसे सही उत्तर के रूप में स्वीकार करने जा रहा हूं, लेकिन मैं सुझाव देता हूं कि या तो कलेक्टरों के लिए स्टेटिक आयात का उल्लेख करें या collect.toList() को जवाब बदल दें। –

+0

इस उत्तर के लिए धन्यवाद! – dahui

4

बस एक लैम्ब्डा है कि तत्वों डाले के साथ सभी map आइटम है कि एक त्रुटि का कारण होगा को बाहर map विधि का उपयोग करके किया गया:

List<TypeY> res = listTypeX 
    .stream() 
    .map((x) -> (TypeY)x) 
    .collect(Collectors.toList()); 
5

जावा में प्रोजेक्ट करना है:

import static java.util.stream.Collectors.toList; 
2

आप Eclipse Collections से selectInstancesOf() उपयोग कर सकते हैं:

MutableList<TypeX> xList = Lists.mutable.empty(); 
MutableList<TypeY> yList = xList.selectInstancesOf(TypeY.class); 

आप List से xList बदल नहीं सकते हैं:

List<TypeX> xList = Lists.mutable.empty(); 
List<TypeY> yList = ListAdapter.adapt(xList).selectInstancesOf(TypeY.class); 

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

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

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