2012-11-17 8 views
11
Map<String,Object> map = Maps.newHashMap(); 
map.put("test","123"); 
map.put("fuyou001","456"); 
map.put("id",145); 
List<Map<String,Object>> list = Lists.newArrayList(); 
list.add(map); 
Lists.transform(list, new Function<Map<String, Object>, Object>() { 
    @Override 
    public Object apply(@Nullable Map<String, Object> input) { 
    System.out.println("test:" + input); 
    return input; 
    } 
}); 
System.out.println(list);` 

कंसोल "परीक्षण ...."अमरूद में लागू आलसी Lists.transform से कैसे बचें?

lazily लागू किया बचने के लिए कैसे
प्रदर्शित नहीं है मैं भी

List<Map<String,Object>> newList = new ArrayList<Map<String, Object>>(list.size()); 
Collections.copy(newList,list); 

कोशिश नहीं लेकिन सामान्य रूप में प्रभाव

उत्तर

19

Function रों नहीं करना चाहिए दुष्प्रभाव हैं; यह तुम्हारी असली समस्या है।

उस ने कहा, यदि आप तुरंत परिवर्तन लागू करने का आग्रह करते हैं, तो एक प्रतिलिपि करें: Lists.newArrayList(Lists.transform(list, function))

+0

अगर मैं Lists.newArrayList का उपयोग नहीं करते (Lists.transform (सूची, समारोह)) जब समारोह के सक्रिय होने का: यह शायद एक और अधिक सुरुचिपूर्ण समाधान है? – fuyou001

+0

जब आप वास्तव में सूची को फिर से सक्रिय करते हैं या क्वेरी करते हैं। –

+0

बहुत बहुत धन्यवाद! – fuyou001

3

लुइस के उत्तर को पूरक करने के लिए, आप Lists.transform() का उपयोग कर रहे हैं जैसे कि यह list, Collections.sort() जैसे संशोधित है। यह नहीं है

आप Lists.transform() की वापसी मान का उपयोग करने के लिए कुछ भी हो देखने के लिए ध्यान में रखते हुए कि यह जो हर बार जब आप इसे फोन का मूल्यांकन किया जाता है एक दृश्य है की है। इसलिए यदि आपको कई बार परिणाम का उपयोग करने की आवश्यकता है, जैसा कि लुई ने कहा था, एक नई List (ArrayList, ImmutableList इत्यादि) में एक प्रतिलिपि करें।

4

एक अपरिवर्तनीय सूची का उपयोग करके मूल्यों को उत्सुकता से गणना करने के लिए मजबूर किया जाएगा, और इस प्रकार, बाद में एक अतिरिक्त प्रति की आवश्यकता नहीं है। ।

list = ImmutableList.copyOf(Lists.transform(list, 
    new Function<Map<String, Object>, Object>() { 
    @Override 
    public Object apply(@Nullable Map<String, Object> input) { 
    System.out.println("test:" + input); 
    return input; 
    } 
})); 
System.out.println(list);` 
संबंधित मुद्दे