অ্যান্ড্রয়েড এপিআই <24 এ জাভা 8 স্ট্রিম এপিআই ব্যবহার করা কি সম্ভব?


89

আমি এই পোস্টটি এখানে পড়েছি । তবে তবুও আমি জাভা 8 স্ট্রিম এপিআই বৈশিষ্ট্যযুক্ত কোডগুলি minSdkVersion <24 এ নিম্নলিখিতগুলির মতো চালাতে পারি না।

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

ত্রুটি বার্তার কারণে এটি চলবে না

কলটির জন্য এপিআই লেভেল 24 প্রয়োজন (বর্তমান মিনিট 15): java.util. Colલેક્શન # স্ট্রিম

সুতরাং কেউ কি সমাধান জানেন?


4
না আপনি
অপি

4
আমার একটি ছোট গ্রন্থাগার রয়েছে যা নীচের এপিএসের
njzk2

4
অনুরূপ প্রশ্নের (এবং উত্তর) জন্য stackoverflow.com/questions/39265004/… এবং স্ট্যাকওভারফ্লো / প্রশ্ন / 39039566/… দেখুন ।
সার্টোরিয়াস

4
@ পেমাপডমডার আপনি জিনজারব্রেড হিসাবে অনেক পিছনে অ্যান্ড্রয়েডকে লক্ষ্য করে নতুন জ্যাক সংকলকটি ব্যবহার করে ল্যাম্বডা এক্সপ্রেশন এবং পদ্ধতি রেফারেন্স ব্যবহার করতে পারেন। আপনার SDK 24 এর নীচে যা থাকতে পারে তা হ'ল ডিফল্ট / স্ট্যাটিক ইন্টারফেস পদ্ধতি এবং স্ট্রিম এপিআই এর মতো জাভা 8 নির্দিষ্ট এপিআই।
সার্টোরিয়াস

আপনি StreamSupport বর্গ এপিআই 24 অধীনে ব্যবহার করতে পারেন
Özer ozcan

উত্তর:


71

[মূল উত্তর]

আপনি এপিআই স্তরের <24 এ জাভ 8 স্ট্রিম ব্যবহার করতে পারবেন না।

তবে কিছু লাইব্রেরি রয়েছে যা কিছু স্ট্রিম কার্যকারিতা ব্যাকপোর্ট করে

https://github.com/aNNiMON/ লাইটওয়েট- স্ট্রিম- এপিআই

https://github.com/konmik/solid

https://sourceforge.net/projects/streamsupport/ (মন্তব্যে @ সর্টোরিয়াস দ্বারা উল্লিখিত)

[কে 3 বি 2019-05-23 আপডেট করুন]

https://github.com/retrostreams/android-retrostreams স্ট্রিমসপোর্টের একটি স্পিন অফ যা অ্যান্ড্রয়েড স্টুডিও 3.x ডি 8 / ডিজুগার টুলচেইনের জার ফাইলের সীমানা জুড়ে ইন্টারফেস ডিফল্ট এবং স্ট্যাটিক পদ্ধতি ব্যবহার করার ক্ষমতা গ্রহণ করে। অন্যান্য অ্যান্ড্রয়েড-রেট্রোএক্সএক্সএক্স-এর লিঙ্কগুলিও রয়েছে কমপ্লেটেবলফিউচারের জন্য।

[অ্যারাকোড 2020-07-24 আপডেট করুন]

সুসংবাদ , এখন আমরা ন্যূনতম এপিআই স্তরের প্রয়োজন ছাড়াই জাভা 8 স্ট্রিম এপিআই এবং আরও অনেক কিছু ব্যবহার করতে পারি ।


9
যদিও সলিড এবং লাইটওয়েট-স্ট্রিম-এপিআই অবশ্যই স্ট্রিমের মতো প্রোগ্রামিংয়ের জন্য মূল্যবান বিকল্প, তবুও IMHO এর কোনওটিই দূরবর্তীভাবে জাভা 8 স্ট্রিম API এর একটি "ব্যাকপোর্ট" হিসাবে বিবেচিত হতে পারে না। শুধু আমি ঘনিষ্ঠ সিনট্যাক্স এবং সমাবস্থা উপর কার্যকারিতা জাভা 8 স্ট্রিম হতে যে করতে পারেন দাবির জানেন প্রকল্প streamsupport । উদাহরণস্বরূপ, এটি সমান্তরাল স্ট্রিমগুলি সমর্থন করে। যদিও এটি অ্যান্ড্রয়েড ডিভাইসের পক্ষে এতটা গুরুত্বপূর্ণ নাও হতে পারে।
সার্টোরিয়াস

গ্রেডল সাপোর্টের কারণে আইএমও, লাইটওয়েট-স্ট্রিম-এপিআই অ্যান্ড্রয়েডের মধ্যে সবচেয়ে সেরা ছিল এবং "সিলেক্ট", "গ্রুপবি", ইত্যাদির মতো অতিরিক্ত সংযোজন করেছে github.com/aNNiiON / Stight-API #additional-operators
লর্ডপ্সলে

4
@ লর্ডপার্সলে স্ট্রিমসপোর্টে গ্রেডল সমর্থনও রয়েছে। অতিরিক্ত হিসাবে, হ্যাঁ এটি সত্য। আমি যেমন এটি বুঝতে পারি, অফিসিয়াল জাভা 8 এপিআই থেকে প্রসারিত / সরিয়ে নেওয়া কখনও স্ট্রিমসপোর্টের ডিজাইন লক্ষ্য হতে পারে নি।
সার্টোরিয়াস

4
@ সার্টোরিয়াস ঠিক বলেছেন - আমি ব্যবহারের বিবরণের জন্য গিথুব আয়নাটি পরীক্ষা করার পরামর্শ দিচ্ছি এবং গ্র্যাডল
রেফস

আমি পড়েছি যে সাধারণভাবে জাভা স্ট্রিমগুলি সংগ্রহের চেয়ে ধীর। stackoverflow.com/questions/22658322/… এই ব্যাকপোর্টগুলি সম্পর্কে কী?
শিখর শ্রীবাস্তব

12

ডেক্সগুয়ার্ডের ৮.২ প্রকাশের পরে অ্যান্ড্রয়েড ডিভাইসে <এপিআই লেভেল ২৪ তেও জাভা 8 স্ট্রিমস এপিআই ব্যবহার করা সম্ভব so এটি করার জন্য, একটির স্ট্রিমসপোর্ট লাইব্রেরি অন্তর্ভুক্ত করা দরকার এবং ডেক্সগার্ড সমস্ত জাভা 8 স্ট্রিমের এপিআই কলগুলিকে সরবরাহ করাতে অনুবাদ করবে গ্রন্থাগার কোনও অতিরিক্ত হ্যান্ডলিং প্রয়োজন হয় না, এবং বিকাশকারীরা প্রদত্ত জাভা 8 স্ট্রিম এপিআই ব্যবহার করে কেবল কোড করতে পারে। নির্ভরতাগুলি স্বয়ংক্রিয়ভাবে অনুবাদ করা হয়, সুতরাং জাভা 8 বৈশিষ্ট্য সহ গ্রন্থাগারগুলি অ্যান্ড্রয়েড বিকাশের জন্যও ব্যবহার করা সম্ভব।

এই বৈশিষ্ট্যটি অদূর ভবিষ্যতে প্রোগার্ডে অন্তর্ভুক্ত করা হবে, থাকুন।

সম্পাদনা করুন: প্রগার্ড .1.১.০ যার জন্য ইতিমধ্যে একটি বিটা সংস্করণ বিদ্যমান রয়েছে জাভা 8 স্ট্রিম এবং টাইম এপিআই ব্যাকপোর্টিং সমর্থন করে।


এটি অফিসিয়াল লাইব্রেরি নয়
ব্যবহারকারী 25

লাইব্রেরিতে নিজেই আমার কোনও ধারণা নেই, তবে আমি বাণিজ্যিক প্রকল্পে ব্যবহারের আগে গ্রন্থাগারের লাইসেন্স পরীক্ষা করার পরামর্শ দেব। ক্লাসপাথ ব্যতিক্রম সহ জিএনইউ জেনারেল পাবলিক লাইসেন্স, সংস্করণ 2 । সম্ভবত একটি স্তর নিশ্চিত করতে হবে।
মিশাল হারকল

4
@ মিশল হারকাল আমাকে বুঝতে পেরেছিল যে স্তরটি আসলে আইনজীবি ছিল কয়েক সেকেন্ড সময় :)
সুপারজোজ

6

পার্টিতে কিছুটা দেরি হতে পারে তবে আমি কেবল দেখেছি যে আমরা যদি ব্যবহার করি java8.util.stream.StreamSupportতবে আমরা একই ফাংশনাল প্রোগ্রামিং অ্যাপ্রোচ চালাতে পারি এবং এপি 24 এর আগে এটি ব্যবহার করতে পারি Eg যেমন ওয়েব 3 জ থেকে নেওয়া -

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

4
@ অজাহানচর্লস ভাষা A সম্পর্কে তাদের প্রশ্ন যখন লোকদের কেবল ভাষা B ব্যবহার করতে বলা ভাল উত্তর নয়। এখনও অনেক প্রকল্প জাভাতে লেখা রয়েছে।
এমকিউচ

4
@AjahnCharles তোমার পাঠকদের মনোযোগ আকর্ষণ সম্পর্কে একটি ভাল পয়েন্ট করা সম্ভবত অ্যান্ড্রয়েড বাস্তুতন্ত্র পরিবর্তন বিবেচনা। এটি বলেছিল, প্রশ্নটি জাভা সম্পর্কিত একটি নির্দিষ্ট বৈশিষ্ট্য সম্পর্কে যা এখনও অ্যান্ড্রয়েড বিকাশের জন্য সরকারীভাবে সমর্থিত একটি ভাষা। আপনার অ্যাপ্লিকেশনকে "কেবল" সংকরকরণ করা সত্ত্বেও, স্যুইচিংয়ের জন্য একটি ব্যয় আনা হয় (শেখার বক্ররেখা, সম্ভবত তাদের দল এটি সমর্থন করে না ইত্যাদি) এবং এ জন্য প্রশ্নে যা বলা হচ্ছে তার চেয়ে অনেক বেশি পথ চালানো দরকার । আরও গুরুত্বপূর্ণ, মন্তব্যে কীভাবে কোটলিন একটি সমাধান বলে সম্বোধন করা হয়নি, যা এটিকে প্রসঙ্গের বাইরে এবং কম সহায়ক করে তোলে।
এমকিউচ

4
@ আজানচর্লেস যখন স্পষ্টভাবে উল্লেখ করা হয়েছে Java 8 Stream API, আমার মনে হয়, উত্তরটিও জাভাতে থাকা উচিত!
অভরিয়া রায়

2

হ্যাঁ, এটা ! এজিপি 4.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, ... ইত্যাদি


-5

একটি ইন্টারফেস তৈরি করুন।

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"));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.