جاوا 8
فنکشنل انٹرفیس
یہ کیا ہے؟ ایک فنکشنل انٹرفیس ایک انٹرفیس ہے جس میں ایک غیر لاگو (خلاصہ) طریقہ ہوتا ہے۔ @FunctionalInterface ایک اختیاری تشریح ہے جو اس طرح کے انٹرفیس کے اوپر رکھی گئی ہے۔ یہ چیک کرنے کی ضرورت ہے کہ آیا یہ ایک فنکشنل انٹرفیس کی ضروریات کو پورا کرتا ہے (صرف ایک خلاصہ طریقہ ہے)۔ لیکن ہمیشہ کی طرح، ہمارے پاس کچھ انتباہات ہیں: پہلے سے طے شدہ اور جامد طریقے ان ضروریات کے تحت نہیں آتے ہیں۔ لہذا، اس طرح کے کئی طریقے ہو سکتے ہیں + ایک خلاصہ، اور انٹرفیس فعال ہوگا۔ اس میں آبجیکٹ کلاس کے طریقے بھی شامل ہوسکتے ہیں جو انٹرفیس کی فنکشنل کی تعریف کو متاثر نہیں کرتے ہیں۔ میں پہلے سے طے شدہ اور جامد طریقوں کے بارے میں کچھ الفاظ شامل کروں گا:-
ڈیفالٹ موڈیفائر والے طریقے آپ کو انٹرفیس میں نئے طریقے شامل کرنے کی اجازت دیتے ہیں ان کے موجودہ نفاذ کو توڑے بغیر۔
public interface Something { default void someMethod { System.out.println("Some text......"); } }
ہاں، ہاں، ہم انٹرفیس میں لاگو کردہ طریقہ شامل کرتے ہیں، اور اس طریقہ کو نافذ کرتے وقت، آپ اسے اوور رائڈ نہیں کر سکتے، لیکن اسے وراثت میں حاصل کردہ کے طور پر استعمال کر سکتے ہیں۔ لیکن اگر ایک کلاس ایک دیئے گئے طریقہ کے ساتھ دو انٹرفیس کو لاگو کرتی ہے، تو ہمارے پاس ایک تالیف کی خرابی ہوگی، اور اگر یہ انٹرفیس کو لاگو کرتا ہے اور ایک مخصوص یکساں طریقہ کے ساتھ کلاس کو وراثت میں دیتا ہے، تو پیرنٹ کلاس کا طریقہ انٹرفیس کے طریقوں کو اوورلیپ کرے گا اور استثناء کام نہیں کرے گا۔
-
انٹرفیس میں جامد طریقے کلاس میں جامد طریقوں کی طرح کام کرتے ہیں ۔ مت بھولنا: آپ جامد طریقوں کو وراثت میں نہیں لے سکتے ہیں، بالکل اسی طرح جیسے آپ کسی نسلی طبقے سے جامد طریقہ کو کال نہیں کر سکتے۔
-
صارف - T قسم کی دلیل لیتا ہے، کچھ بھی نہیں دیتا (باطل)۔
مثال:
void someMethod(T t);
-
سپلائر - ان پٹ کے طور پر کچھ نہیں لیتا، لیکن کچھ قدر T واپس کرتا ہے۔
مثال:
T someMethod();
-
فنکشن - ان پٹ کے طور پر T قسم کا پیرامیٹر لیتا ہے، قسم R کی قدر لوٹاتا ہے۔
مثال:
R someMethod(T t);
-
UnaryOperator - T دلیل لیتا ہے اور T قسم کی قدر لوٹاتا ہے۔
مثال:
T someMethod(T t);
Predicate - دلیل کے طور پر کچھ قدر T لیتا ہے، بولین لوٹاتا ہے۔
مثال:boolean someMethod(T t);
ندی
اسٹریمز ایک فنکشنل انداز میں ڈیٹا ڈھانچے کو ہینڈل کرنے کا ایک طریقہ ہیں۔ عام طور پر یہ مجموعے ہوتے ہیں (لیکن آپ انہیں دوسرے، کم عام حالات میں استعمال کر سکتے ہیں)۔ زیادہ قابل فہم زبان میں، Stream ایک ڈیٹا سٹریم ہے جس پر ہم اس طرح کارروائی کرتے ہیں جیسے کہ ایک ہی وقت میں تمام ڈیٹا کے ساتھ کام کر رہے ہوں، نہ کہ طاقت کے ساتھ، جیسا کہ ہر ایک کے لیے۔ آئیے ایک چھوٹی سی مثال دیکھتے ہیں۔ ہم کہتے ہیں کہ ہمارے پاس نمبروں کا ایک سیٹ ہے جسے ہم فلٹر کرنا چاہتے ہیں (50 سے کم)، 5 کا اضافہ کریں، اور پہلے 4 نمبروں کو بقیہ نمبروں سے کنسول میں آؤٹ پٹ کریں۔ ہم یہ پہلے کیسے کرتے:List<Integer> list = Arrays.asList(46, 34, 24, 93, 91, 1, 34, 94);
int count = 0;
for (int x : list) {
if (x >= 50) continue;
x += 5;
count++;
if (count > 4) break;
System.out.print(x);
}
ایسا لگتا ہے کہ زیادہ کوڈ نہیں ہے، اور منطق پہلے سے ہی تھوڑا سا الجھا ہوا ہے۔ آئیے دیکھتے ہیں کہ یہ سلسلہ کا استعمال کرتے ہوئے کیسا نظر آئے گا:
Stream.of(46, 34, 24, 93, 91, 1, 34, 94)
.filter(x -> x < 50)
.map(x -> x + 5)
.limit(4)
.forEach(System.out::print);
اسٹریمز کوڈ کی مقدار کو کم کرکے اور اسے مزید پڑھنے کے قابل بنا کر زندگی کو بہت آسان بنا دیتے ہیں۔ ان لوگوں کے لیے جو اس موضوع کو مزید تفصیل سے دیکھنا چاہتے ہیں، یہاں اس موضوع پر ایک اچھا (میں بہترین کہوں گا) مضمون ہے ۔
لیمبڈا
شاید سب سے اہم اور طویل انتظار کی خصوصیت لیمبڈاس کی ظاہری شکل ہے۔ لیمبڈا کیا ہے؟ یہ کوڈ کا ایک بلاک ہے جسے مختلف جگہوں پر منتقل کیا جا سکتا ہے تاکہ اسے بعد میں جتنی بار ضرورت ہو اس پر عمل کیا جا سکے۔ بہت مبہم لگتا ہے، ہے نا؟ سیدھے الفاظ میں، لیمبڈاس کا استعمال کرتے ہوئے، آپ ایک فنکشنل انٹرفیس (ایک گمنام کلاس کے نفاذ کی ایک قسم):Runnable runnable = () -> { System.out.println("I'm running !");};
new Thread(runnable).start();
ہم نے تیزی سے اور غیر ضروری سرخ ٹیپ کے بغیر run() طریقہ کو نافذ کیا۔ اور ہاں: رن ایبل ایک فعال انٹرفیس ہے۔ میں اسٹریمز کے ساتھ کام کرتے وقت لیمبڈاس کا بھی استعمال کرتا ہوں (جیسا کہ اوپر کی ندیوں والی مثالوں میں)۔ ہم زیادہ گہرائی میں نہیں جائیں گے، چونکہ ہم کافی گہرائی میں غوطہ لگا سکتے ہیں، اس لیے میں چند لنکس چھوڑ دوں گا تاکہ وہ لوگ جو ابھی تک دل کی گہرائیوں میں کھود رہے ہیں وہ مزید گہرائی میں کھود سکیں:
- Habré پر جاوا 8 میں لیمبڈا اظہار کے بارے میں مضمون
- الیگزینڈر کوسریف کے بلاگ پر جاوا میں لیمبڈا اظہار کے بارے میں مضمون
ہر ایک کے لئے
جاوا 8 کے پاس ایک نیا فورچ ہے جو ڈیٹا سٹریم کے ساتھ ایک سٹریم کی طرح کام کرتا ہے۔ یہاں ایک مثال ہے:List<Integer> someList = Arrays.asList(1, 3, 5, 7, 9);
someList.forEach(x -> System.out.println(x));
(someList.stream().foreach(…)) کے مطابق
طریقہ حوالہ
حوالہ جات کے طریقے ایک نیا، مفید نحو ہے جو موجودہ طریقوں یا جاوا کلاسز یا اشیاء کے کنسٹرکٹرز کا حوالہ دینے کے لیے ڈیزائن کیا گیا ہے بذریعہ :: طریقہ حوالہ جات چار اقسام میں آتے ہیں:-
ڈیزائنر سے لنک:
SomeObject obj = SomeObject::new
-
جامد طریقہ حوالہ:
SomeObject::someStaticMethod
-
کسی خاص قسم کی چیز کے غیر جامد طریقہ کا حوالہ:
SomeObject::someMethod
-
کسی مخصوص شے کے باقاعدہ (غیر جامد) طریقہ کا حوالہ
obj::someMethod
someList.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
ان لوگوں کے لیے جو حوالہ کے طریقوں پر مزید معلومات چاہتے ہیں:
API کا وقت
تاریخوں اور اوقات کے ساتھ کام کرنے کے لیے ایک نئی لائبریری ہے - java.time۔ نیا API کسی بھی جوڈا ٹائم سے ملتا جلتا ہے۔ اس API کے سب سے اہم حصے یہ ہیں:- لوکل ڈیٹ ایک مخصوص تاریخ ہے، مثال کے طور پر - 2010-01-09؛
- لوکل ٹائم - ٹائم زون کو مدنظر رکھتے ہوئے وقت - 19:45:55 (لوکل ڈیٹ کے مطابق)؛
- لوکل ڈیٹ ٹائم - کامبو لوکل ڈیٹ + لوکل ٹائم - 04-01-2020 15:37:47؛
- ZoneId - ٹائم زونز کی نمائندگی کرتا ہے؛
- گھڑی - اس قسم کا استعمال کرتے ہوئے آپ موجودہ وقت اور تاریخ تک رسائی حاصل کرسکتے ہیں۔
- جاوا اور وقت: حصہ ایک اور دو Habré پر
- جاوا 8 میں تاریخ/وقت API کا تعارف
اختیاری
یہ java.util پیکیج میں ایک نئی کلاس ہے ، ایک ویلیو ریپر جس کی چال یہ ہے کہ یہ محفوظ طریقے سے null پر مشتمل ہوسکتی ہے ۔ اختیاری وصول کرنا: اگر ہم Optional.ofOptional<String> someOptional = Optional.of("Something");
میں null پاس کرتے ہیں تو ہمیں اپنا پسندیدہ NullPointerException ملے گا ۔ اس طرح کے معاملات میں وہ استعمال کرتے ہیں: - اس طریقہ میں آپ کو null سے ڈرنے کی ضرورت نہیں ہے۔ اس کے بعد، ایک ابتدائی طور پر خالی اختیاری بنائیں: یہ چیک کرنے کے لیے کہ آیا یہ خالی ہے، استعمال کریں: ہمارے پاس صحیح یا غلط واپس آئے گا۔ اگر کوئی قدر ہو تو ایک خاص عمل کریں، اور اگر کوئی قدر نہ ہو تو کچھ نہ کریں: ایک الٹا طریقہ جو پاس شدہ قدر واپس کرتا ہے اگر اختیاری خالی ہے (ایک بیک اپ پلان کی طرح): آپ بہت، بہت طویل وقت تک جاری رکھ سکتے ہیں ( خوش قسمتی سے، اختیاری نے دونوں فراخ ہاتھوں سے طریقے شامل کیے ہیں) لیکن ہم اس پر غور نہیں کریں گے۔ میرے لیے بہتر ہے کہ شروع کرنے والوں کے لیے چند لنکس چھوڑ دوں: Optional<String> someOptional = Optional.ofNullable("Something");
Optional<String> someOptional = Optional.empty();
someOptional.isPresent();
someOptional.ifPresent(System.out::println);
System.out.println(someOptional.orElse("Some default content"));
- جاوا اختیاری - ہولیورز کا باپ
- اختیاری: جاوا 8 میں شروڈنگر کی بلی۔
- جاوا 8 میں نئی اختیاری کلاس، NullPointerException کے لیے کوئی علاج نہیں۔
- جاوا 8 کی خصوصیات: جاوا رش کے لیے حتمی گائیڈ - حصہ ایک اور دو ؛
- Habré پر جاوا 8 میں نیا ؛
- جاوا 8 کی ٹاپ 10 خصوصیات جن کے بارے میں لوگ بات نہیں کرتے ۔
- جاوا 8 ٹیوٹوریل
جاوا 9
لہذا، 21 ستمبر 2017 کو، دنیا نے JDK 9 دیکھا۔ یہ Java 9 خصوصیات کے بھرپور سیٹ کے ساتھ آتا ہے۔ اگرچہ زبان کے کوئی نئے تصورات نہیں ہیں، نئے APIs اور تشخیصی کمانڈز یقینی طور پر ڈویلپرز کے لیے دلچسپی کا باعث ہوں گے۔JShell (REPL - read-eval-print loop)
یہ ایک انٹرایکٹو کنسول کا جاوا نفاذ ہے جو فنکشنلٹی کو جانچنے اور کنسول میں مختلف تعمیرات جیسے انٹرفیس، کلاسز، اینوم، آپریٹرز وغیرہ استعمال کرنے کے لیے استعمال ہوتا ہے۔ JShell شروع کرنے کے لیے ، آپ کو ٹرمینل میں صرف jshell لکھنے کی ضرورت ہے۔ پھر ہم جو کچھ بھی ہماری تخیل کی اجازت دیتا ہے لکھ سکتے ہیں: JShell کا استعمال کرتے ہوئے، آپ اعلیٰ سطح کے طریقے بنا سکتے ہیں اور انہیں اسی سیشن میں استعمال کر سکتے ہیں۔ یہ طریقے جامد طریقوں کی طرح کام کریں گے، سوائے اس کے کہ جامد مطلوبہ الفاظ کو چھوڑ دیا جائے۔ Java 9 REPL (JShell) مینوئل میں مزید پڑھیں ۔نجی
جاوا کے ورژن 9 سے شروع کرتے ہوئے، ہمارے پاس انٹرفیس میں نجی طریقے استعمال کرنے کا موقع ہے (پہلے سے طے شدہ اور جامد طریقے، کیونکہ ناکافی رسائی کی وجہ سے ہم دوسروں کو اوور رائڈ نہیں کر سکتے)۔private static void someMethod(){}
try-with-resources
Try-with-Resources کے استثناء کو ہینڈل کرنے کی صلاحیت کو اپ گریڈ کر دیا گیا ہے:
BufferedReader reader = new BufferedReader(new FileReader("....."));
try (reader2) {
....
}
ماڈیولرٹی ( Jigsaw )
ایک ماڈیول ایک نئی ماڈیول ڈسکرپٹر فائل کے ساتھ متعلقہ پیکیجز اور وسائل کا ایک گروپ ہے۔ یہ نقطہ نظر کوڈ کے جوڑے کو ڈھیلا کرنے کے لیے استعمال کیا جاتا ہے۔ کوڈ کو برقرار رکھنے اور توسیع پذیری کے لیے ڈھیلا جوڑا ایک کلیدی عنصر ہے۔ ماڈیولریٹی کو مختلف سطحوں پر لاگو کیا جاتا ہے:- پروگرامنگ زبان.
- ورچوئل مشین۔
- معیاری جاوا API۔
ناقابل تغیر مجموعہ
جاوا 9 میں، ایک لائن کے ساتھ مجموعہ بنانا اور پُر کرنا ممکن ہو گیا، جبکہ اسے ناقابل تغیر بناتے ہوئے (پہلے، ایک ناقابل تغیر مجموعہ بنانے کے لیے، ہمیں ایک مجموعہ بنانے، اسے ڈیٹا سے پُر کرنے، اور ایک طریقہ کو کال کرنے کی ضرورت تھی، مثال کے طور پر، Collections.unmodifiableList)۔ ایسی تخلیق کی ایک مثال:List someList = List.of("first","second","third");
دیگر اختراعات:
- توسیع شدہ اختیاری (نئے طریقے شامل کیے گئے)؛
- ProcessHandle اور ProcessHandle انٹرفیس آپریٹنگ سسٹم کے اعمال کو کنٹرول کرنے کے لیے ظاہر ہوئے؛
- G1 - پہلے سے طے شدہ کوڑا اٹھانے والا؛
- HTTP/2 پروٹوکول اور WebSocket دونوں کے لیے سپورٹ کے ساتھ HTTP کلائنٹ؛
- توسیع شدہ سلسلہ؛
- Reactive Streams API فریم ورک شامل کیا گیا (ری ایکٹو پروگرامنگ کے لیے)؛
- Habré پر جاوا 9 کا جائزہ
- Java 9. نیا کیا ہے؟
- جاوا 9: نئی خصوصیات
- Java 9 - کیا آپ نے ابھی تک اپ گریڈ کیا ہے؟ نہیں؟ اور یہ ضروری نہیں...!؟
- جاوا ماڈیولز میں منتقلی پر Sander Mak
جاوا 10
لہذا، جاوا 9 کی ریلیز کے چھ ماہ بعد، مارچ 2018 میں (مجھے کل کی طرح یاد ہے)، جاوا 10 منظرعام پر آیا۔var
اب ہمیں ڈیٹا کی قسم فراہم کرنے کی ضرورت نہیں ہے۔ ہم پیغام کو var کے طور پر نشان زد کرتے ہیں اور مرتب کرنے والا پیغام کی قسم کا تعین دائیں جانب موجود انیشیلائزر کی قسم سے کرتا ہے۔ یہ خصوصیت صرف مقامی متغیرات کے لیے دستیاب ہے جس میں ابتدائیہ ہے: اسے طریقہ کار کے دلائل، واپسی کی اقسام، وغیرہ کے لیے استعمال نہیں کیا جا سکتا، کیونکہ قسم کی وضاحت کرنے کے لیے کوئی انیشیلائزر نہیں ہے۔ مثال var (ٹائپ سٹرنگ کے لیے):var message = "Some message…..";
System.out.println(message);
var کلیدی لفظ نہیں ہے: یہ بنیادی طور پر ایک مخصوص قسم کا نام ہے، بالکل int کی طرح ۔ var کا فائدہ بہت اچھا ہے: قسم کے اعلانات کوئی فائدہ لائے بغیر بہت زیادہ توجہ دیتے ہیں، اور یہ خصوصیت وقت کی بچت کرے گی۔ لیکن ایک ہی وقت میں، اگر طریقوں کی ایک لمبی زنجیر سے ایک متغیر حاصل کیا جائے تو، کوڈ کم پڑھنے کے قابل ہو جاتا ہے، کیونکہ یہ فوری طور پر واضح نہیں ہوتا ہے کہ وہاں کس قسم کی چیز موجود ہے۔ ان لوگوں کے لیے وقف ہے جو اس فعالیت سے زیادہ واقف ہونا چاہتے ہیں:
- Java 10 Local Variable Type-Inference
- جاوا 10 میں "var" کے ساتھ پہلا رابطہ
- جاوا میں var قسم استعمال کرنے کے 26 نکات
JIT مرتب کرنے والا (GraalVM)
مزید اڈو کے بغیر، میں آپ کو یاد دلاتا ہوں کہ جب آپ javac کمانڈ چلاتے ہیں، تو جاوا ایپلیکیشن جاوا کوڈ سے JVM بائیک کوڈ میں مرتب ہوتی ہے، جو کہ ایپلی کیشن کی بائنری نمائندگی ہے۔ لیکن ایک باقاعدہ کمپیوٹر پروسیسر صرف JVM بائیک کوڈ پر عمل نہیں کر سکتا۔ آپ کے JVM پروگرام کے کام کرنے کے لیے، آپ کو اس بائیک کوڈ کے لیے ایک اور کمپائلر کی ضرورت ہے، جو مشین کوڈ میں تبدیل ہو جائے جسے پروسیسر پہلے ہی استعمال کرنے کے قابل ہو۔ javac کے مقابلے میں، یہ کمپائلر بہت زیادہ پیچیدہ ہے، لیکن یہ اعلیٰ معیار کا مشین کوڈ بھی تیار کرتا ہے۔ فی الحال، OpenJDK میں HotSpot ورچوئل مشین ہے، جس کے نتیجے میں دو اہم JIT کمپائلر ہیں۔ پہلا، C1 ( کلائنٹ کمپائلر )، تیز رفتار آپریشن کے لیے ڈیزائن کیا گیا ہے، لیکن کوڈ کی اصلاح کا سامنا کرنا پڑتا ہے۔ دوسرا C2 (سرور کمپائلر) ہے۔ عملدرآمد کی رفتار کا سامنا کرنا پڑتا ہے، لیکن کوڈ زیادہ بہتر ہے. کون سا کب استعمال ہوتا ہے؟ C1 ڈیسک ٹاپ ایپلی کیشنز کے لیے بہت اچھا ہے جہاں طویل JIT توقف ناپسندیدہ ہے، اور C2 طویل عرصے سے چلنے والے سرور پروگراموں کے لیے بہترین ہے جہاں تالیف پر زیادہ وقت گزارنا کافی قابل برداشت ہے۔ کثیر سطحی تالیف تب ہوتی ہے جب تالیف پہلے C1 سے گزرتی ہے، اور نتیجہ C2 (زیادہ سے زیادہ اصلاح کے لیے استعمال ہوتا ہے) سے گزرتا ہے۔ GraalVM ہاٹ سپاٹ کو مکمل طور پر تبدیل کرنے کے لیے بنایا گیا ایک پروجیکٹ ہے۔ ہم Graal کے بارے میں کئی متعلقہ پروجیکٹس کے طور پر سوچ سکتے ہیں: ہاٹ سپاٹ کے لیے ایک نیا JIT کمپائلر اور ایک نئی پولی گلوٹ ورچوئل مشین۔ اس جے آئی ٹی کمپائلر کی خاصیت یہ ہے کہ یہ جاوا میں لکھا گیا ہے۔ Graal کمپائلر کا فائدہ حفاظت ہے، یعنی کریش نہیں، لیکن استثناء، میموری لیک نہیں ہے۔ ہمارے پاس اچھی IDE سپورٹ بھی ہو گی، اور ہم ڈیبگرز، پروفائلرز یا دیگر آسان ٹولز استعمال کر سکیں گے۔ اس کے علاوہ، کمپائلر HotSpot سے آزاد ہو سکتا ہے، اور یہ خود کا ایک تیز تر JIT-مرتب شدہ ورژن بنانے کے قابل ہو گا۔ کھودنے والوں کے لیے:- نئے جاوا جے آئی ٹی کمپائلر میں گہرا غوطہ لگائیں۔
- Graal: نئے JVM JIT کمپائلر کو حقیقی زندگی میں کیسے استعمال کیا جائے۔
- Graal کیسے کام کرتا ہے - Java JVM JIT کمپائلر
متوازی G1
G1 کوڑا اٹھانے والا ٹھنڈا ہے، اس میں کوئی شک نہیں، لیکن اس کا ایک کمزور نقطہ بھی ہے: یہ واحد تھریڈڈ مکمل GC سائیکل انجام دیتا ہے۔ ایسے وقت میں جب آپ کو ہارڈ ویئر کی تمام طاقت کی ضرورت ہوتی ہے جسے آپ غیر استعمال شدہ اشیاء کو تلاش کرنے کے لیے جمع کر سکتے ہیں، ہم صرف ایک دھاگے تک محدود ہیں۔ یہ جاوا 10 میں طے کیا گیا تھا۔ اب جی سی اب ان تمام وسائل کے ساتھ کام کرتا ہے جو ہم اس میں شامل کرتے ہیں (یعنی یہ ملٹی تھریڈ ہو جاتا ہے)۔ اس کو حاصل کرنے کے لیے، لینگویج ڈویلپرز نے GC سے اہم ماخذ کی الگ تھلگ کو بہتر بنایا ہے، جس سے GC کے لیے ایک صاف ستھرا انٹرفیس بنایا گیا ہے۔ اس خوبصورتی کے ڈویلپرز، OpenJDK، کو خاص طور پر کوڈ میں موجود ڈمپ کو صاف کرنا پڑا تاکہ نہ صرف نئے GCs کی تخلیق کو زیادہ سے زیادہ آسان بنایا جا سکے، بلکہ اسمبلی سے غیر ضروری GCs کو فوری طور پر غیر فعال کرنا بھی ممکن بنایا جا سکے۔ کامیابی کا ایک اہم معیار ان تمام بہتریوں کے بعد آپریٹنگ اسپیڈ میں کمی کی عدم موجودگی ہے۔ آئیے یہ بھی دیکھتے ہیں: دیگر اختراعات:- ایک صاف کچرا جمع کرنے والا انٹرفیس متعارف کرایا گیا ہے۔ یہ مختلف کوڑا اٹھانے والوں سے سورس کوڈ کی الگ تھلگ کو بہتر بناتا ہے، جس سے متبادل جمع کرنے والوں کو جلدی اور بغیر تکلیف کے انضمام کرنا ممکن ہو جاتا ہے۔
- JDK ذرائع کو ایک ذخیرہ میں ملانا؛
- مجموعوں کو ایک نیا طریقہ موصول ہوا - copyOf (مجموعہ) ، جو اس مجموعہ کی ایک ناقابل تغیر کاپی واپس کرتا ہے۔
- اختیاری (اور اس کی مختلف حالتوں) کا ایک نیا طریقہ ہے .orElseThrow() ;
- اب سے، JVMs کو معلوم ہے کہ وہ ڈوکر کنٹینر میں چل رہے ہیں اور خود آپریٹنگ سسٹم سے استفسار کرنے کے بجائے کنٹینر کے لیے مخصوص کنفیگریشن کو بازیافت کریں گے۔
- جاوا 10 کے لیے گائیڈ
- 10 JDK 10 خصوصیات جاوا ڈویلپرز کو معلوم ہونا چاہئے۔
- جاوا 10 میں نیا کیا ہے: حصہ ایک اور دوسرا
GO TO FULL VERSION