আমি এর মধ্যে পার্থক্য দিকে তাকিয়ে করে থাকেন Collections.sortএবং list.sort, বিশেষ করে ব্যবহার সংক্রান্ত Comparatorস্ট্যাটিক পদ্ধতি এবং কিনা PARAM ধরনের ল্যামডা এক্সপ্রেশন প্রয়োজন হয়। আমরা শুরু করার আগে, আমি জানি যে আমি পদ্ধতি উল্লেখগুলি ব্যবহার করতে পারি, উদাহরণস্বরূপ Song::getTitleআমার সমস্যাগুলি কাটিয়ে উঠতে, তবে এখানে আমার ক্যোয়ারী তেমন কিছু নয় যা আমি ঠিক করতে চাই তবে এমন একটি উত্তর যার আমি উত্তর চাই, অর্থাৎ কেন জাভা সংকলক এটিকে এভাবে পরিচালনা করছেন? ।
এগুলি আমার সন্ধান ধরুন আমাদের ArrayListকয়েকটি ধরণের Songগান রয়েছে এবং এর সাথে 3 টি স্ট্যান্ডার্ড গেট পদ্ধতি রয়েছে:
ArrayList<Song> playlist1 = new ArrayList<Song>();
//add some new Song objects
playlist.addSong( new Song("Only Girl (In The World)", 235, "Rhianna") );
playlist.addSong( new Song("Thinking of Me", 206, "Olly Murs") );
playlist.addSong( new Song("Raise Your Glass", 202,"P!nk") );
এখানে উভয় প্রকারের বাছাই পদ্ধতিতে কল রয়েছে যা কোনও সমস্যা নেই:
Collections.sort(playlist1,
Comparator.comparing(p1 -> p1.getTitle()));
playlist1.sort(
Comparator.comparing(p1 -> p1.getTitle()));
আমি চেইন করতে শুরু করার thenComparingসাথে সাথে নিম্নলিখিতগুলি ঘটে:
Collections.sort(playlist1,
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
playlist1.sort(
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
অর্থাত্ সিনট্যাক্স ত্রুটি কারণ এটি p1আর প্রকারটি জানে না। সুতরাং এটি ঠিক করার জন্য আমি Songপ্রথম প্যারামিটারে (তুলনা করার) টাইপ যুক্ত করব :
Collections.sort(playlist1,
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
playlist1.sort(
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
এখন এখানে বিবেচনা অংশ আসে। পি laylist1.sort, অর্থাৎ তালিকার জন্য, নিম্নলিখিত thenComparingসংস্থাগুলির জন্য সমস্ত সংকলন ত্রুটি সমাধান করে। তবে Collections.sortএটির জন্য এটি প্রথমটির জন্য সমাধান করে তবে শেষটি নয়। আমি পরীক্ষামূলকভাবে আরও কয়েকটি অতিরিক্ত কল যুক্ত করেছি thenComparingএবং এটি সর্বদা সর্বশেষের জন্য একটি ত্রুটি দেখায়, যদি না আমি (Song p1)প্যারামিটারটির জন্য না রাখি ।
এখন আমি এটি তৈরি করে TreeSetএবং ব্যবহার করে আরও পরীক্ষা করে দেখেছি Objects.compare:
int x = Objects.compare(t1, t2,
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
Set<Song> set = new TreeSet<Song>(
Comparator.comparing((Song p1) -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
একই জিনিসটি ঘটে যায়, এর জন্য TreeSet, কোনও সংকলন ত্রুটি নেই তবে Objects.compareশেষ কলটির জন্য thenComparingত্রুটি দেখানো হয়।
কেউ কি দয়া করে ব্যাখ্যা করতে পারেন যে এটি কেন ঘটছে এবং কেন (Song p1)কেবল তুলনামূলক পদ্ধতিটি thenComparingকল করার সময় (কোনও কল ছাড়াই ) কেন ব্যবহার করার প্রয়োজন নেই ।
একই বিষয়ে অন্য একটি ক্যোয়ারী হ'ল আমি যখন এটি করি TreeSet:
Set<Song> set = new TreeSet<Song>(
Comparator.comparing(p1 -> p1.getTitle())
.thenComparing(p1 -> p1.getDuration())
.thenComparing(p1 -> p1.getArtist())
);
অর্থাত্ Songতুলনা পদ্ধতি কলের জন্য প্রথম ল্যাম্বদা প্যারামিটার থেকে টাইপটি সরিয়ে ফেলুন , এটি তুলনার কলের অধীনে সিনট্যাক্স ত্রুটিগুলি দেখায় এবং thenComparingচূড়ান্ত কলটিতে নয় তবে প্রথমটি thenComparingযা ঘটছিল তার প্রায় বিপরীত! অন্যদিকে, অন্য 3 টি উদাহরণের জন্য অর্থাত্ সহ Objects.compare, List.sortএবং Collections.sortআমি যখন প্রথম Songপ্যারাম টাইপটি সরিয়ে ফেলি এটি সমস্ত কলগুলির জন্য সিনট্যাক্স ত্রুটিগুলি দেখায়।
অগ্রিম ধন্যবাদ.
এক্সিলিপ কেপলার এসআর 2-এ আমি যে ত্রুটিগুলি পেয়েছিলাম তার স্ক্রিনশট অন্তর্ভুক্ত করার জন্য সম্পাদিত, যা আমি এখন থেকে পেয়েছি তা হল এক্স্লিপ সুনির্দিষ্ট কারণ কমান্ড-লাইনে JDK8 জাভা সংকলক ব্যবহার করার পরে এটি ঠিক আছে iles
