মনে করুন আমার কাছে জিনিসগুলির একটি স্ট্রিম রয়েছে এবং আমি তাদের মাঝের স্ট্রিমটি "সমৃদ্ধ" করতে চাই, আমি এটি করতে এটি ব্যবহার peek()
করতে পারি, যেমন:
streamOfThings.peek(this::thingMutator).forEach(this::someConsumer);
ধরে নিন যে কোডগুলিতে এই মুহুর্তে জিনিসগুলিকে রূপান্তর করা সঠিক আচরণ - উদাহরণস্বরূপ, thingMutator
পদ্ধতিটি "লাস্ট প্রসেসড" ক্ষেত্রটি বর্তমান সময়ের জন্য সেট করতে পারে।
তবে peek()
বেশিরভাগ প্রসঙ্গে "চেহারা, তবে স্পর্শ করবেন না" এর অর্থ।
ব্যবহার করছে peek()
থেকে পরিবর্তন ঘটান প্রবাহ উপাদান একটি antipattern বা অবিবেকী?
সম্পাদনা:
বিকল্প, আরও প্রচলিত, পদ্ধতি হ'ল গ্রাহককে রূপান্তর করা:
private void thingMutator(Thing thing) {
thing.setLastProcessed(System.currentTimeMillis());
}
একটি ফাংশনে যা প্যারামিটারটি দেয়:
private Thing thingMutator(Thing thing) {
thing.setLastProcessed(currentTimeMillis());
return thing;
}
এবং map()
পরিবর্তে ব্যবহার করুন:
stream.map(this::thingMutator)...
কিন্তু যে প্রবর্তন গতানুগতিক কোড ( return
) এবং আমি বিশ্বাস করছি না এটা পরিষ্কার, কারণ আপনি জানেন peek()
আয় একই বস্তু, কিন্তু map()
এটা এমনকি এক নজরে এটি একই সময়ে পরিষ্কার নয় বর্গ বস্তুর।
আরও, আপনার সাথে peek()
এমন একটি ল্যাম্বডা থাকতে পারে যা পরিবর্তিত হয় তবে map()
আপনাকে ট্রেনের ধ্বংসস্তূপ তৈরি করতে হবে। তুলনা করা:
stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...)
stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...)
আমি মনে করি peek()
সংস্করণটি আরও পরিষ্কার, এবং ল্যাম্বদা স্পষ্টভাবে পরিবর্তিত হচ্ছে, তাই কোনও "রহস্যময়" পার্শ্ব প্রতিক্রিয়া নেই। একইভাবে, যদি কোনও পদ্ধতির রেফারেন্স ব্যবহার করা হয় এবং পদ্ধতির নামটি স্পষ্টভাবে মিউটেশনকে বোঝায় তবে তাও স্পষ্ট এবং সুস্পষ্ট।
একটি ব্যক্তিগত নোটে, আমি peek()
রূপান্তর করতে ব্যবহার করতে দ্বিধা করি না - আমি এটি খুব সুবিধাজনক বলে মনে করি।
peek
এমন স্ট্রিম ব্যবহার করেছেন যা এর উপাদানগুলিকে গতিময়ভাবে উত্পন্ন করে? এটি এখনও কাজ করে না, বা পরিবর্তনগুলি কি হারিয়েছে? একটি স্রোতের উপাদানগুলিকে সংশোধন করা আমার কাছে বিশ্বাসযোগ্য নয়।
List<Thing> list; things.stream().peek(list::add).forEach(...);
খুব সহজ। ইদানীং. আমি এটা ব্যবহার করেছি প্রকাশ করার জন্য তথ্য যোগ করার জন্য: Map<Thing, Long> timestamps = ...; return things.stream().peek(t -> t.setTimestamp(timestamp.get(t))).collect(toList());
। আমি জানি এই উদাহরণটি করার অন্যান্য উপায় আছে তবে আমি এখানে প্রচুর পরিমাণে সরল করছি। ব্যবহার peek()
আরও কমপ্যাক্ট এবং আরও মার্জিত কোড আইএমএইচও উত্পাদন করে। পাঠযোগ্যতা একপাশে, এই প্রশ্নটি আপনি যা উত্থাপন করেছেন তা সম্পর্কে সত্যই; এটা কি নিরাপদ / নির্ভরযোগ্য?
peek
? আমার স্ট্যাকওভারফ্লোতে একই রকম প্রশ্ন রয়েছে এবং আশা করি আপনি এটি দেখতে এবং আপনার প্রতিক্রিয়া জানাতে পারেন। ধন্যবাদ। stackoverflow.com/questions/47356992/...