क्या एंड्रॉइड एपीआई <24 पर जावा 8 स्ट्रीम एपीआई का उपयोग करना संभव है?


89

मैंने इस पोस्ट को यहाँ पढ़ा है। लेकिन फिर भी मैं minsdkVersion <24 पर निम्न की तरह जावा 8 स्ट्रीम एपीआई सुविधाओं वाले कोड को नहीं चला सकता।

List<Car> newCars = cars.stream()
                        .filter(s -> s.getColor().equals("red"))
                        .collect(Collectors.toList());

यह त्रुटि संदेश के कारण नहीं चलता है

कॉल के लिए एपीआई स्तर 24 (वर्तमान न्यूनतम 15): java.util.Collection # स्ट्रीम की आवश्यकता होती है

तो क्या कोई समाधान जानता है?


3
नहीं, आप एपी 24 के नीचे जावा स्ट्रीम का उपयोग नहीं कर सकते। 3 पार्टी लाइब्रेरी हैं जो उसी काम को लागू करती हैं
tyczj

1
मेरे पास एक छोटी सी लाइब्रेरी है जो लोअर
एपीस के

2
इसी तरह के सवालों (और उत्तरों) के लिए stackoverflow.com/questions/39265004/… और stackoverflow.com/questions/39039566/… देखें ।
सार्टोरियस

3
@PEMapModder आप नए जैक कम्पाइलर को एंड्रॉइड को जिंजरब्रेड के रूप में लक्षित करते हुए लैम्बडा एक्सप्रेशन और विधि संदर्भ का उपयोग कर सकते हैं। आपके पास एसडीके 24 के नीचे जो नहीं हो सकता है वह डिफ़ॉल्ट / स्टैटिक इंटरफ़ेस मेथड और जावा 8 विशिष्ट एपीआई जैसे स्ट्रीम एपीआई हैं।
सार्टोरियस

आप एपीटी 24 के तहत StreamSupport वर्ग का उपयोग कर सकते हैं
Özer

जवाबों:


69

[मूल उत्तर]

आप API स्तर <24 पर Java8 स्ट्रीम का उपयोग नहीं कर सकते।

हालाँकि, कुछ लायब्रेरीज़ हैं जो स्ट्रीम कार्यक्षमता में से कुछ को बैकपोर्ट करती हैं

https://github.com/aNNiMON/Lightweight-Stream-API

https://github.com/konmik/solid

https://sourceforge.net/projects/streamsupport/ (टिप्पणी में @ sartorius द्वारा उल्लिखित)

[k3b 2019-05-23 को अपडेट करें]

https://github.com/retrostreams/android-retrostreams , स्ट्रीम स्ट्रीमपोर्ट से एक स्पिनऑफ़ है जो कि Android फ़ाइल 3.x D8 / desugar toolchain की क्षमता का लाभ उठाती है, जो जार फ़ाइल सीमाओं के पार इंटरफ़ेस डिफ़ॉल्ट और स्थिर विधियों का उपयोग करती है। कंप्लीटटेबल फ़ॉरेस्ट के लिए अन्य एंड्रॉइड-रेट्रोएक्सएक्सएक्सएक्सएक्स के लिंक भी हैं।

[एरोडोड 2020-07-24 को अपडेट करें]

अच्छी खबर है , अब हम न्यूनतम एपीआई स्तर की आवश्यकता के बिना जावा 8 स्ट्रीम एपीआई और अधिक का उपयोग कर सकते हैं ।


9
जबकि ठोस और हल्के-स्ट्रीम-एपीआई निश्चित रूप से के लिए स्ट्रीम की तरह प्रोग्रामिंग, उनमें से कोई भी IMHO भी दूर से एक जावा 8 स्ट्रीम एपीआई के "backport" माना जा सकता मूल्यवान विकल्प हैं। केवल मैं करीब वाक्य रचना में और सममूल्य पर कार्यक्षमता में जावा के लिए 8 धाराओं है होना करने के लिए है कि कर सकते हैं दावा के बारे में पता परियोजना streamsupport । उदाहरण के लिए, यह समानांतर धाराओं का भी समर्थन करता है। हालांकि यह एंड्रॉइड देवों के लिए इतना महत्वपूर्ण नहीं हो सकता है।
सार्टोरियस

आईएमओ, लाइटवेट-स्ट्रीम-एपीआई ग्रैडल सपोर्ट के कारण एंड्रॉइड पर सबसे अच्छा था और "सिलेक्ट", "ग्रुपबाय", आदि जैसे अतिरिक्त एक्सट्रैस को जोड़ देता है। github.com/aNNiMON/Lightweight-Stream-APn#additional-operators
लॉर्डपर्सले

2
@ LordParsley स्ट्रीम में ग्रैडल सपोर्ट भी है। अतिरिक्त के लिए, हाँ यह सच है। जैसा कि मैं इसे समझता हूं, आधिकारिक जावा 8 एपीआई से विस्तार / विचलन कभी भी स्ट्रीमअप के डिजाइन का लक्ष्य नहीं रहा है।
सार्टोरियस

3
@Sartorius सही है - मैं उपयोग जानकारी के लिए Github दर्पण और Gradle refs देखने की अनुशंसा करते github.com/streamsupport/streamsupport
LordParsley

मैंने पढ़ा है कि सामान्य रूप से जावा स्ट्रीम संग्रह की तुलना में धीमी होती हैं। stackoverflow.com/questions/22658322/… इन बैकपोर्ट के बारे में क्या?
शिखर श्रीवास्तव

12

की रिहाई के बाद से 8.2 DexGuard यह एक जरूरत है Android उपकरणों <एपीआई स्तर 24 पर भी जावा 8 धाराओं एपीआई का उपयोग करने के लिए आदेश में ऐसा करने के लिए, शामिल करने के लिए संभव है streamsupport पुस्तकालय और DexGuard प्रदान की करने के लिए सभी जावा 8 धारा API कॉल अनुवाद करेगा पुस्तकालय। कोई अतिरिक्त हैंडलिंग की आवश्यकता नहीं है, और डेवलपर्स प्रदान किए गए जावा 8 स्ट्रीम एपीआई का उपयोग करके बस कोड कर सकते हैं। निर्भरताएं भी स्वचालित रूप से अनुवादित की जाती हैं, इसलिए Android विकास के लिए भी जावा 8 सुविधाओं के साथ पुस्तकालयों का उपयोग करना संभव है।

निकट भविष्य में ProGuard में भी यह सुविधा शामिल रहेगी, देखते रहें।

संपादित करें: 6.1.0 की रक्षा करें, जिसके लिए पहले से ही एक बीटा संस्करण मौजूद है, जावा 8 स्ट्रीम और टाइम एपीआई बैकपोर्टिंग का समर्थन करता है।


यह आधिकारिक पुस्तकालय नहीं है
user25

मुझे वास्तव में स्वयं पुस्तकालय का कोई विचार नहीं है, लेकिन मैं एक वाणिज्यिक परियोजना में उपयोग करने से पहले पुस्तकालय के लाइसेंस की जांच करने की सलाह दूंगा। जीएनयू जनरल पब्लिक लाइसेंस, संस्करण 2, क्लासपाथ अपवाद के साथ । संभवत: एक परत की पुष्टि करनी होगी।
मिशाल हरकल

5
@ मिचललारकल ने मुझे उस परत का एहसास कराने में कुछ सेकंड का समय लिया, जो वास्तव में वकील थे :)
सुपरजोस

6

पार्टी में थोड़ी देर हो सकती है, लेकिन मैंने अभी देखा कि यदि हम उपयोग करते हैं java8.util.stream.StreamSupportतो हम एक ही कार्यात्मक प्रोग्रामिंग दृष्टिकोण को चला सकते हैं और इसे Api 24 से पहले उपयोग कर सकते हैं। जैसे web3j से लिया गया है -

StreamSupport.stream(transactionReceipt.getLogs())
            .map(log -> extractEventParameters(event, log))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());

3
@AjahnCharles लोगों से कह रहा है कि भाषा B का उपयोग तब करें जब भाषा A के बारे में उनका प्रश्न एक अच्छा उत्तर नहीं है। कई प्रोजेक्ट अभी भी जावा में लिखे गए हैं।
mkuech

2
@AjahnCharles आप संभवतः एंड्रॉइड पारिस्थितिकी तंत्र में परिवर्तनों पर विचार करने के लिए पाठकों का ध्यान आकर्षित करने के बारे में एक अच्छा बिंदु बनाते हैं । उस ने कहा, सवाल जावा की एक विशिष्ट विशेषता के बारे में है जो अभी भी एंड्रॉइड विकास के लिए आधिकारिक रूप से समर्थित भाषा है। स्विचिंग, भले ही "केवल" अपने अनुप्रयोग hybridizing, एक लागत (सीखने की अवस्था है, शायद उनकी टीम इसका समर्थन नहीं करता, आदि) लाता है और कि में गोता की आवश्यकता है जिस तरह से क्या सवाल में कहा जा रहा है की तुलना में अधिक। इससे भी महत्वपूर्ण बात यह है कि टिप्पणी से पता नहीं चलता है कि कैसे कोटलिन एक समाधान है, जो इसे अधिक संदर्भ और कम सहायक बनाता है।
mkuech

3
@AjahnCharles जब स्पष्ट रूप से उल्लेख किया गया है Java 8 Stream API, तो मुझे लगता है, इसका जवाब भी जावा में होना चाहिए!
अभय रॉय

1

हाँ, यह है ! AGP 4.0.0 से शुरू होकर हम स्ट्रीम एपीआई और कुछ अन्य जावा 8+ एपीआई (जैसे java.time) का उपयोग कर सकते हैं

आपके ऐप के build.gradle में न्यूनतम आवश्यक परिवर्तन :

android {
  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}

-1

एक और उपाय जो मुझे उपयोग करना पसंद है, वह है जावा कोड से कलेक्शंस पर कोटलिन के एक्सटेंशन को स्टेटिक रूप से इस्तेमाल करना, अगर प्रोजेक्ट दोनों को सपोर्ट करता है :

List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));

उसी के लिए .map, .reduce, .first, ... आदि


-6

एक anterface बनाएँ।

public interface Pre<T,R> {
            R get(T item);
        }

एक फ़िल्टर विधि बनाएँ।

public static  <T> List<T> Filter(List<T> list, Pre<T,Boolean> pre) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        {
            return list.stream().filter(p -> pre.get(p)).collect(Collectors.toList());
        }
        else
        {
            List<T> col = new ArrayList<T>();
            for (int i = 0 ; i < list.size() ; i++)
                if (pre.get(list.get(i)))
                    col.add(list.get(i));
            return col;
        }
    }

कोड का उपयोग करना

    public static class model {
            public String Name;
        }
List<model> models = new ArrayList<>();
            ...
            List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.