একটি পদ্ধতি রেফারেন্স রচনা করার একটি উপায় রয়েছে যা বর্তমান পদ্ধতি রেফারেন্সের বিপরীত। নীচে @ ভ্ল্যাকের উত্তর দেখুন যা দেখায় যে কীভাবে স্পষ্টভাবে কোনও পদ্ধতির রেফারেন্সটি কাস্ট করে Predicateএবং তারপরে এটি negateফাংশনটি ব্যবহার করে রূপান্তর করে । এটি করা খুব ঝামেলাজনক কিছু উপায়গুলির মধ্যে একটি উপায়।
এর বিপরীত:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
এটি কি:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
অথবা এটা:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
ব্যক্তিগতভাবে, আমি পরবর্তী কৌশলটি পছন্দ করি কারণ আমি it -> !it.isEmpty()দীর্ঘ ভার্বোস স্পষ্ট কাস্টের চেয়ে পড়তে এবং তারপরে অস্বীকার করার বিষয়টি আরও স্পষ্ট মনে করি ।
যে কেউ একটি ভবিষ্যদ্বাণী করতে পারে এবং এটি পুনরায় ব্যবহার করতে পারে:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
অথবা, যদি সংগ্রহ বা অ্যারে থাকে তবে কেবল একটি লুপ ব্যবহার করুন যা সাধারণ, কম ওভারহেড রয়েছে এবং * ** দ্রুত হতে পারে:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* যদি আপনি কী দ্রুত তা জানতে চান, তবে জেএমএইচ http://openjdk.java.net/projects/code-tools/jmh ব্যবহার করুন , এবং হ্যান্ড বেঞ্চমার্ক কোডটি সমস্ত জেভিএম অপ্টিমাইজেশন এড়ানো না হলে - জাভা 8 দেখুন: স্ট্রিমের পারফরম্যান্স দেখুন বনাম সংগ্রহ
** ফর-লুপ কৌশলটি দ্রুততর হওয়ার পরামর্শ দেওয়ার জন্য আমি ঝাঁকুনি পাচ্ছি। এটি একটি স্ট্রিম তৈরিটিকে সরিয়ে দেয়, এটি অন্য পদ্ধতি কল (প্রিডিকেটের জন্য নেতিবাচক ফাংশন) ব্যবহার করে বাদ দেয় এবং এটি একটি অস্থায়ী সঞ্চয়ের তালিকা / কাউন্টারকে সরিয়ে দেয়। তাই শেষের নির্মাণের দ্বারা সংরক্ষিত কয়েকটি জিনিস যা এটি আরও দ্রুত তৈরি করতে পারে।
আমি মনে করি এটি সহজ এবং সুন্দর যদিও দ্রুত না হলেও। যদি কাজটি হাতুড়ি এবং পেরেকের জন্য কল করে তবে একটি চেইনসো এবং আঠালো আনবে না! আমি জানি আপনারা কেউ কেউ এটি নিয়ে ইস্যু নেন।
wish-list: আমি জাভা Streamফাংশনগুলি এখন একটু বিবর্তিত হতে দেখতে চাই যে জাভা ব্যবহারকারীরা তাদের সাথে আরও পরিচিত। উদাহরণস্বরূপ, স্ট্রিমের 'কাউন্ট' পদ্ধতিটি এমন কোনও গ্রহণ Predicateকরতে পারে যাতে এটি সরাসরি এভাবে করা যায়:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)পদ্ধতির সংযোজনকে কভার করে । তবে এই সমস্যাটি এখনও খোলা রয়েছে তাই আমরা এটি জাভা 12-এর প্রথম দিকে (যদি কখনও হয়) দেখব।