جیسا کہ آپ جانتے ہیں، ہماری عادتیں دوسری فطرت ہیں۔ اور ایک بار جب آپ لکھنے کے عادی ہو جائیں تو
for (int i = 0; i <......)
آپ کا کوئی بھی حصہ اس تعمیر کو دوبارہ سیکھنا نہیں چاہتا ہے (خاص طور پر چونکہ یہ کافی آسان اور قابل فہم ہے)۔ تاہم، لوپس اکثر ایک ہی بنیادی کارروائیوں کو انجام دینے کے لیے بار بار استعمال کیے جاتے ہیں، اور تکرار ایک ایسی چیز ہے جس سے ہم چھٹکارا حاصل کرنا چاہتے ہیں۔ جاوا 8 کے ساتھ، اوریکل نے ایسا کرنے میں ہماری مدد کرنے کا فیصلہ کیا ہے۔ ذیل میں جمع کرنے کے 10 بہترین طریقے ہیں جو آپ کا ایک ٹن وقت اور کوڈ بچائیں گے۔
1. Iterable.forEach(صارف <? سپر T> ایکشن)
نام خود ہی بولتا ہے۔ یہ ایک دلیل کے طور پر منظور کردہ مجموعہ پر اعادہ کرتا ہے، اور اس کے ہر ایک عنصر کے لیے ایکشن لیمبڈا اظہار کو انجام دیتا ہے۔List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.forEach(s -> System.out.print(s + " "));
1 2 3 4 5 6 7
2. Collection.removeIf(Predicate<? super E> filter)
ایک بار پھر، یہاں کچھ بھی مشکل نہیں ہے. طریقہ مجموعہ پر اعادہ کرتا ہے اور مماثل عناصر کو ہٹا دیتا ہےfilter
۔
List <Integer> numbers = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7));
numbers.removeIf(s -> s > 5);
numbers.forEach(s -> System.out.print(s + " "));
ایک لائن میں، ہم فہرست سے 5 سے بڑے تمام نمبروں کو ہٹا رہے ہیں۔
3. Map.forEach(BiConsumer <? super K, ? super V> ایکشن)
یہforEach
طریقہ نہ صرف ان کلاسوں کے لیے کام کرتا ہے جو Collection
انٹرفیس کو نافذ کرتی ہیں، بلکہ اس کے لیے بھی Map
۔
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
4. Map.compute (K کلید، BiFunction<? Super K،? Super V،? توسیع کرتا ہے V> remappingFunction)
تھوڑا زیادہ ڈرانے والا لگتا ہے، لیکن حقیقت میں سادہ، پچھلے تمام لوگوں کی طرح۔ یہ طریقہkey
عمل درآمد کے نتیجے کے برابر کی قدر کا تعین کرتا ہے mappingFunction
۔ مثال کے طور پر:
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
books.compute("Thinking in Java", (a,b) -> b + ", cool dude");
System.out.println("_______________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
_______________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel, cool dude
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
"Thinking in Java" کا مصنف یقیناً اچھا ہے! :)
5. Map.computeIfAbsent(K کلید، فنکشن <؟ سپر K، ? توسیع کرتا ہے V> میپنگ فنکشن)
یہ طریقہ میں ایک نیا عنصر شامل کرے گاMap
، لیکن صرف اس صورت میں جب اس میں اس کلید کے ساتھ کوئی عنصر پہلے سے موجود نہ ہو۔ تفویض کردہ قدر کو عمل میں لانے کا نتیجہ ہوگا mappingFunction
۔ اگر کلید کے ساتھ کوئی عنصر پہلے سے موجود ہے تو اسے اوور رائٹ نہیں کیا جائے گا۔ یہ بس ویسے ہی رہے گا۔ آئیے اپنی کتابوں کی طرف لوٹتے ہیں اور ایک نیا طریقہ آزماتے ہیں:
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.computeIfAbsent("Harry Potter and the Prisoner of Azkaban", b -> getHarryPotterAuthor());
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
یہاں ہمارا ہے mappingFunction
:
public static String getHarryPotterAuthor() {
return "Joanne Rowling";
}
اور یہاں نئی کتاب ہے:
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Harry Potter and the Prisoner of Azkaban. Author: Joanne Rowling
Book title: Lord of the Rings. Author: John Tolkien
6. Map.computeIfPresent(K key, BiFunction<? super K,? super V, ? توسیع کرتا ہے V> remappingFunction)
یہاں ہمارے پاس وہی اصول ہے جیسا کہMap.compute()
، لیکن حسابات صرف اس صورت میں کیے جاتے ہیں جب کوئی شے key
پہلے سے موجود ہو۔
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.computeIfPresent("Eugene Onegin", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
books.computeIfPresent("The Brothers Karamazov", (a,b) -> b = "Alexander Pushkin");
System.out.println("_________________");
books.forEach((a,b) -> System.out.println("Book title: " + a + ". Author: "+ b));
فنکشن کے لیے پہلی کال میں کوئی تبدیلی نہیں کی گئی، کیونکہ ہمارے Map
. لیکن دوسری کال میں، پروگرام نے کتاب "دی برادرز کارامازوف" کے مصنف کو تبدیل کر کے الیگزینڈر پشکن کر دیا۔ آؤٹ پٹ:
_________________
Book title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
_________________
Book title: The Brothers Karamazov. Author: Alexander Pushkin
Book title: Thinking in Java. Author: Bruce Eckel
Book title: Crime and Punishment. Author: Fyodor Dostoevsky
Book title: War and Peace. Author: Leo Tolstoy
Book title: Lord of the Rings. Author: John Tolkien
7. Map.getOrDefault(آبجیکٹ کلید، V ڈیفالٹ ویلیو)
یہ طریقہ اس سے متعلقہ قدر لوٹاتا ہےkey
۔ اگر کلید موجود نہیں ہے، تو یہ پہلے سے طے شدہ قدر لوٹاتا ہے۔
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
String igor = books.getOrDefault("The Tale of Igor's Campaign", "Unknown author");
System.out.println(igor);
یہ بہت آسان ہے:
Unknown author
8. Map.merge(K کلید، V قدر، BiFunction<? super V،? super V، ? توسیع کرتا ہے V> remappingFunction)
میں نے یہ حساب لگانے کی زحمت بھی نہیں کی کہ کوڈ کی کتنی لائنیں یہ طریقہ آپ کو بچائے گا۔- اگر
key
آپ کے میں موجود نہیں ہےMap
، یا اگرvalue
اس کلید کے لیے ہےnull
، تو طریقہ پاس شدہkey-value
جوڑے کو میں شامل کرتا ہےMap
۔ - اگر
key
موجود ہے اور اس کاvalue != null
، تو طریقہ اس کی قدر کو پھانسی دینے کے نتیجے میں بدل دیتا ہےremappingFunction
۔ - اگر
remappingFunction
واپس آتا ہےnull
، توkey
مجموعہ سے ہٹا دیا جاتا ہے۔
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.merge("Thinking in Java", "Bruce Eckel", (a, b) -> b + " and some coauthor");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
آؤٹ پٹ:
Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel and some coauthor
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
*معذرت، بروس*
9. Map.putIfAbsent(K کلید، V قدر)
پہلے، a میں ایک جوڑا شامل کرنے کے لیےMap
، اگر یہ پہلے سے موجود نہیں تھا، تو آپ کو درج ذیل کام کرنا پڑتا تھا:
Map <String, String> map = new HashMap<>();
if (map.get("Lord of the Rings") == null)
map.put("Lord of the Rings", "John Tolkien");
اب سب کچھ بہت آسان ہو گیا ہے:
Map<String, String> map = new HashMap<>();
map.putIfAbsent("Lord of the Rings", "John Tolkien");
10. Map.replace اور Map.replaceAll()
آخری لیکن کم از کم نہیں۔Map.replace(K key, V newValue)
key
کی قدر کو سے بدل دیتا ہےnewValue
، اگر ایسی کلید موجود ہو۔ اگر نہیں تو کچھ نہیں ہوتا۔Map.replace(K key, V oldValue, V newValue)
ایک ہی کام کرتا ہے، لیکن صرف اس صورت میں جب موجودہ قیمت کےkey
برابر ہوoldValue
۔Map.replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
ہر ایک کوvalue
فنکشن کے نتیجے سے بدل دیتا ہے۔
Map <String, String> books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.replace("The Brothers Karamazov", "Bruce Eckel", "John Tolkien");
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
Title: The Brothers Karamazov. Author: Fyodor Dostoevsky
Title: Thinking in Java. Author: Bruce Eckel
Title: Crime and Punishment. Author: Fyodor Dostoevsky
Title: War and Peace. Author: Leo Tolstoy
Title: Lord of the Rings. Author: John Tolkien
یہ کام نہیں کیا! کلید "دی برادرز کارامازوف" کی موجودہ قیمت "فیوڈور دوستوفسکی" ہے، "بروس ایکل" نہیں، اس لیے کچھ بھی نہیں بدلا ہے۔
Map books = new HashMap<>();
books.put("War and Peace", "Leo Tolstoy");
books.put("Crime and Punishment", "Fyodor Dostoevsky");
books.put("Thinking in Java", "Bruce Eckel");
books.put("The Brothers Karamazov", "Fyodor Dostoevsky");
books.put("The Lord of the Rings", "John Tolkien");
books.replaceAll((a,b) -> getCoolAuthor());
books.forEach((a, b) -> System.out.println("Title: " + a + ". Author: "+ b));
public static String getCoolAuthor() {
return "Cool author";
}
Title: The Brothers Karamazov. Author: Cool author
Title: Thinking in Java. Author: Cool author
Title: Crime and Punishment. Author: Cool author
Title: War and Peace. Author: Cool author
Title: Lord of the Rings. Author: Cool author
Map
ہم نے بغیر کسی پیچیدہ تعمیرات کے پورے کے لیے قدروں کو آسانی سے تبدیل کر دیا ! PS نئے کی عادت ڈالنا ہمیشہ مشکل ہوتا ہے، لیکن یہ تبدیلیاں واقعی اچھی ہیں۔ کسی بھی صورت میں، میرے کوڈ کے کچھ حصے یقینی طور پر پہلے کی نسبت اسپگیٹی کی طرح کم ہیں :) سیکھنے میں اچھی قسمت!
GO TO FULL VERSION