मुझे एक मैप फंक्शन चाहिए। क्या जावा में पहले से ऐसा कुछ है?
(उन लोगों के लिए जो आश्चर्य करते हैं: मैं निश्चित रूप से जानता हूं कि इस तुच्छ कार्य को कैसे लागू किया जाए ...)
मुझे एक मैप फंक्शन चाहिए। क्या जावा में पहले से ऐसा कुछ है?
(उन लोगों के लिए जो आश्चर्य करते हैं: मैं निश्चित रूप से जानता हूं कि इस तुच्छ कार्य को कैसे लागू किया जाए ...)
जवाबों:
JDK में java 6 के रूप में एक फंक्शन की कोई धारणा नहीं है।
अमरूद में एक फंक्शन इंटरफ़ेस है और यह
विधि आपको आवश्यक कार्यक्षमता प्रदान करती है।
Collections2.transform(Collection<E>, Function<E,E2>)
उदाहरण:
// example, converts a collection of integers to their
// hexadecimal string representations
final Collection<Integer> input = Arrays.asList(10, 20, 30, 40, 50);
final Collection<String> output =
Collections2.transform(input, new Function<Integer, String>(){
@Override
public String apply(final Integer input){
return Integer.toHexString(input.intValue());
}
});
System.out.println(output);
आउटपुट:
[a, 14, 1e, 28, 32]
इन दिनों, जावा 8 के साथ, वास्तव में एक मानचित्र फ़ंक्शन है, इसलिए मैं शायद अधिक संक्षिप्त तरीके से कोड लिखूंगा:
Collection<String> hex = input.stream()
.map(Integer::toHexString)
.collect(Collectors::toList);
Collections2.transform(input -> Integer.toHexString(intput.intValue())
जावा 8 के बाद से, JDK में ऐसा करने के लिए कुछ मानक विकल्प हैं:
Collection<E> in = ...
Object[] mapped = in.stream().map(e -> doMap(e)).toArray();
// or
List<E> mapped = in.stream().map(e -> doMap(e)).collect(Collectors.toList());
देखें java.util.Collection.stream()
और java.util.stream.Collectors.toList()
।
toList()
। विभिन्न प्रकार की जगह:(List<R>)((List) list).replaceAll(o -> doMap((E) o));
e -> doMap(e)
बस के साथ बदला जा सकता है doMap
?
foo::doMap
या Foo::doMap
।
फ़ंक्शनल जावा नामक एक अद्भुत पुस्तकालय है, जिसमें आप चाहते हैं कि जावा में बहुत सी चीज़ें हैं, लेकिन यह नहीं है। तो फिर, यह अद्भुत भाषा स्काला भी है जो सबकुछ जावा करता है लेकिन जेवीएम के लिए लिखे गए किसी भी चीज़ के साथ संगत नहीं होने के बावजूद।
a.map({int i => i + 42});
क्या उन्होंने कंपाइलर का विस्तार किया? या जोड़े गए प्रीप्रोसेसर?
Collections2.transform()
अमरूद से बहुत सावधान रहें । इस विधि का सबसे बड़ा फायदा इसका सबसे बड़ा खतरा भी है: इसका आलस्य।
के प्रलेखन को देखो Lists.transform()
, जो मुझे लगता है कि इस पर भी लागू होता है Collections2.transform()
:
फ़ंक्शन को आलसी रूप से लागू किया जाता है, जब आवश्यक हो। लौटी हुई सूची को देखने के लिए यह आवश्यक है, लेकिन इसका अर्थ यह है कि फ़ंक्शन को कई बार लागू किया जाएगा जैसे कि List.contains (java.lang.Object) और List.hashCode ()। इसके लिए अच्छा प्रदर्शन करने के लिए, फ़ंक्शन तेज़ होना चाहिए। आलसी मूल्यांकन से बचने के लिए जब लौटी सूची को देखने की आवश्यकता नहीं है, तो अपने चयन की नई सूची में दी गई सूची की प्रतिलिपि बनाएँ।
इसके अलावा, Collections2.transform()
उनके उल्लेख में आपको एक जीवंत दृश्य मिलता है, स्रोत सूची में परिवर्तन रूपांतरित सूची को प्रभावित करता है। इस तरह के व्यवहार से मुश्किल-से-ट्रैक समस्याएं हो सकती हैं, अगर डेवलपर को उसके काम करने के तरीके का एहसास नहीं है।
यदि आप अधिक शास्त्रीय "मानचित्र" चाहते हैं, जो एक बार और केवल एक बार चलेगा, तो आप इसके साथ बेहतर हैं FluentIterable
, अमरूद से भी, जिसका एक ऑपरेशन है जो बहुत अधिक सरल है। यहाँ इसके लिए गूगल उदाहरण है:
FluentIterable
.from(database.getClientList())
.filter(activeInLastMonth())
.transform(Functions.toStringFunction())
.limit(10)
.toList();
transform()
यहाँ मानचित्र विधि है। यह समान फ़ंक्शन <> "कॉलबैक" का उपयोग करता है Collections.transform()
। आपके द्वारा वापस ली गई सूची केवल पढ़ने के copyInto()
लिए है , हालांकि, पढ़ने-लिखने की सूची प्राप्त करने के लिए उपयोग करें।
अन्यथा निश्चित रूप से जब java8 लैम्ब्डा के साथ बाहर आता है, तो यह अप्रचलित होगा।
यह एक अन्य कार्यात्मक काम है जिसके साथ आप मानचित्र का उपयोग कर सकते हैं: http://code.google.com/p/totallylazy/
sequence(1, 2).map(toString); // lazily returns "1", "2"
हालांकि यह एक पुराना सवाल है, मैं एक और समाधान दिखाना चाहूंगा:
जावा जेनरिक और जावा 8 धाराओं का उपयोग करते हुए अपने स्वयं के ऑपरेशन को परिभाषित करें:
public static <S, T> List<T> map(Collection<S> collection, Function<S, T> mapFunction) {
return collection.stream().map(mapFunction).collect(Collectors.toList());
}
आप इस तरह से कोड लिख सकते हैं:
List<String> hex = map(Arrays.asList(10, 20, 30, 40, 50), Integer::toHexString);