2010-10-26 13 views
8

मैं स्ट्रिंग सरणी में प्रत्येक तत्व को कॉलबैक विधि लागू करने का एक आसान तरीका ढूंढ रहा हूं।जावा: ऐरे मानों पर कॉलबैक लागू करें

$array = array_map('strtolower', $array); 

वहाँ जावा में यह पूरा करने के लिए एक सरल तरीका है: PHP में उदाहरण के लिए मैं इस तरह एक सरणी में सभी तत्वों को बना सकते हैं?

+0

वह लाइन क्या करती है? यह बिल्कुल अभिव्यक्तिपूर्ण नहीं है। – skaffman

+0

@ स्काफमैन - PHP का स्ट्रेटोलॉवर() फ़ंक्शन जावा की .toLowerCase() के समान, एक स्ट्रिंग कम cased देता है। उपर्युक्त कार्य $ सरणी में प्रत्येक तत्व को strtolower() फ़ंक्शन (मानचित्र) लागू करता है, इस प्रकार निचले भाग वाले सभी तत्वों के साथ एक सरणी लौटाता है। – mellowsoon

उत्तर

3

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

String[] arr = new String[...]; 

... 

for(int i = 0; i < arr.length; i++){ 
    arr[i] = arr[i].toLowerCase(); 
} 
+0

+1 जबकि सूचीबद्ध प्रश्न को हल करने के लिए दिलचस्प जवाब हैं, कभी-कभी, विशेष रूप से किसी नई भाषा सीखने वाले व्यक्ति के लिए, सीधे आगे और सरल ट्रम्प चालाक। – Bill

+0

मुझे इस उत्तर के साथ जाना होगा। अन्य उत्तर मैपिंग सरणी वस्तुओं के ठीक उदाहरण हैं, लेकिन समाधान सरल पुनरावृत्ति से कहीं अधिक जटिल हैं, जो मैं सरल बनाने की कोशिश कर रहा था। – mellowsoon

7

सबसे पहले, जावा में ऑब्जेक्ट सरणी List एस से बहुत कम हैं, इसलिए यदि संभव हो तो आपको वास्तव में उनका उपयोग करना चाहिए। Arrays.asList का उपयोग कर List<String> के रूप में आप String[] का दृश्य बना सकते हैं।

दूसरा, जावा में लैम्ब्डा अभिव्यक्ति या विधि संदर्भ नहीं हैं, इसलिए ऐसा करने का कोई शानदार तरीका नहीं है ... और String के रूप में इसके नाम से एक विधि का संदर्भ देना अत्यधिक त्रुटि प्रवण है और अच्छा विचार नहीं है। ,

public static final Function<String, String> TO_LOWER = 
    new Function<String, String>() { 
     public String apply(String input) { 
     return input.toLowerCase(); 
     } 
    }; 

// returns a view of the input list with each string in all lower case 
public static List<String> toLower(List<String> strings) { 
    // transform in Guava is the functional "map" operation 
    return Lists.transform(strings, TO_LOWER); 
} 

इसे में एक नई सरणी या List हर String की लोअरकेस संस्करण बनाने और को कॉपी के विपरीत इस करता है:

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

जावा 8 के साथ, लैम्ब्डा अभिव्यक्ति और विधि संदर्भ अंत में जावा के लिए map की तरह उच्च क्रम कार्यों के लिए विस्तार के तरीकों के साथ जोड़ा जाना चाहिए, इस काफी आसान (कुछ इस तरह) बनाने:

List<String> lowerCaseStrings = strings.map(String#toLowerCase); 
+0

मैं आपका जवाब स्वीकार करना चाहता हूं, क्योंकि यह इस बात के बारे में है कि मुझे उम्मीद है कि यह कैसे किया जाएगा। लेकिन आदमी .. यह केवल एक ही उपयोग के लिए मेरी परियोजना में जोड़ने के लिए एक भारी लाइब्रेरी है। :/ – mellowsoon

+0

@mellowsoon: मेरा विश्वास करो, गुवा का उपयोग करने के कई अन्य कारण हैं। यह सिर्फ एक छोटा सा उदाहरण है। – ColinD

1

आप इस्तेमाल कर सकते हैं प्रतिबिंब:

+०१२३५१६४१०
String[] map(java.lang.reflect.Method method, String[] array) { 
    String[] new_array = new String[array.length]; 
    for (int i = 0; i < array.length; i++) new_array[i] = (String)method.invoke(null, new Object[]{array[i]}); 
    return new_array; 
} 

फिर आपको केवल एक स्थैतिक विधि घोषित करने की आवश्यकता है और प्रतिबिंब API का उपयोग करके इसका संदर्भ प्राप्त करना होगा।

+0

इस तरह की चीज के लिए वर्बोज़ कक्षाएं बनाना है, क्योंकि प्रतिबिंब वास्तव में व्यवहार्य विकल्प नहीं है। विधि नामों के लिए त्रुटि-प्रवण स्ट्रिंग अक्षर का उपयोग करने की आवश्यकता (जो किसी विधि का नाम बदल दिया जाता है) और विधि के पैरामीटर और रिटर्न प्रकार के रूप में किसी भी तरह की सुरक्षा की कमी यह बेहद नाजुक हो जाती है। – ColinD

+0

ओपी के PHP कोड से अधिक नाजुक :) :) –

+0

आप इसके बारे में बिल्कुल सही हैं, लेकिन यह निश्चित रूप से ऐसा कुछ नहीं है जिसे मैं कहीं भी नकल करना चाहता हूं। – ColinD

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