এখানে সোটিরিওস ডেলিমনোলিসের উত্তরের কিছু প্রকরণ রয়েছে , যা (+1) দিয়ে শুরু করা বেশ ভাল ছিল। নিম্নোক্ত বিবেচনা কর:
static <X, Y, Z> Map<X, Z> transform(Map<? extends X, ? extends Y> input,
Function<Y, Z> function) {
return input.keySet().stream()
.collect(Collectors.toMap(Function.identity(),
key -> function.apply(input.get(key))));
}
একটি দম্পতি এখানে পয়েন্ট। প্রথমে জেনেরিকসে ওয়াইল্ডকার্ড ব্যবহার করা হয়; এটি ফাংশনটিকে কিছুটা নমনীয় করে তোলে। একটি ওয়াইল্ডকার্ড প্রয়োজনীয় হবে যদি উদাহরণস্বরূপ, আপনি আউটপুট মানচিত্রে একটি চাবি রাখতে চান যা ইনপুট মানচিত্রের কীটির একটি সুপারক্লাস রয়েছে:
Map<String, String> input = new HashMap<String, String>();
input.put("string1", "42");
input.put("string2", "41");
Map<CharSequence, Integer> output = transform(input, Integer::parseInt);
(মানচিত্রের মানগুলির জন্য একটি উদাহরণ রয়েছে তবে এটি সত্যই স্বীকৃত এবং আমি স্বীকার করি যে ওয়াইয়ের জন্য সীমাবদ্ধ ওয়াইল্ডকার্ড থাকা কেবল প্রান্তের ক্ষেত্রে সহায়তা করে))
দ্বিতীয় পয়েন্টটি হ'ল ইনপুট মানচিত্রের উপর দিয়ে স্ট্রিমটি চালানোর পরিবর্তে entrySet
আমি এটির উপর দিয়ে দৌড়েছি keySet
। এটি কোডটিকে কিছুটা পরিষ্কার করে দেয়, আমি মনে করি মানচিত্রের প্রবেশের পরিবর্তে মানচিত্রের বাইরে মানগুলি আনতে হবে। ঘটনাচক্রে, প্রথমদিকে আমার key -> key
প্রথম যুক্তি হিসাবে ছিল এবং এটি toMap()
কোনও কারণে কোনও প্রকার অনুমানের ত্রুটিতে ব্যর্থ হয়েছিল। এটি (X key) -> key
যেমন কাজ করেছে তেমন পরিবর্তন করা Function.identity()
।
আরও একটি ভিন্নতা নিম্নরূপ:
static <X, Y, Z> Map<X, Z> transform1(Map<? extends X, ? extends Y> input,
Function<Y, Z> function) {
Map<X, Z> result = new HashMap<>();
input.forEach((k, v) -> result.put(k, function.apply(v)));
return result;
}
এটি Map.forEach()
স্ট্রিমের পরিবর্তে ব্যবহার করে। এটি এমনকি সহজ, আমি মনে করি, কারণ এটি সংগ্রহকারীদের সাথে বিতরণ করে, যা মানচিত্রের সাথে ব্যবহার করতে কিছুটা আনাড়ি। কারণটি হ'ল Map.forEach()
পৃথক প্যারামিটার হিসাবে কী এবং মান দেয়, যেখানে স্ট্রিমটির একটি মাত্র মান থাকে - এবং আপনাকে কী বা মানটি মান হিসাবে প্রবেশদ্বারটি ব্যবহার করতে হবে তা বেছে নিতে হবে। বিয়োগের দিকে, এটিতে অন্যান্য পদ্ধতির সমৃদ্ধ, স্ট্রিম ভালির অভাব রয়েছে। :-)
e -> e.getKey()
সঙ্গেMap.Entry::getKey
। তবে এটি স্বাদ / প্রোগ্রামিং স্টাইলের বিষয়।