JavaRush /جاوا بلاگ /Random-UR /جاوا 8 کی خصوصیات - حتمی گائیڈ (حصہ 2)
0xFF
سطح
Донецк

جاوا 8 کی خصوصیات - حتمی گائیڈ (حصہ 2)

گروپ میں شائع ہوا۔
مضمون جاوا 8 فیچرز کے ترجمہ کا دوسرا حصہ – دی الٹی میٹ گائیڈ ۔ پہلا حصہ یہاں ہے (لنک تبدیل ہو سکتا ہے)۔ جاوا 8 کی خصوصیات - آخری گائیڈ (حصہ 2) - 1

5. جاوا 8 لائبریریوں میں نئی ​​خصوصیات

جاوا 8 نے بہت سی نئی کلاسیں شامل کی ہیں اور موجودہ کلاسوں میں توسیع کی ہے تاکہ جدید ہم آہنگی، فنکشنل پروگرامنگ، تاریخ/وقت، اور بہت کچھ کو بہتر طریقے سے سپورٹ کیا جا سکے۔

5.1 کلاس اختیاری۔

مشہور NullPointerException جاوا ایپلیکیشن کی ناکامی کی اب تک کی سب سے عام وجہ ہے۔ کافی عرصہ پہلے، گوگل کے بہترین پراجیکٹ امرود کوOptional ایک حل کے طور پر پیش کیا گیا تھا NullPointerException، اس طرح کوڈ کو null چیک سے آلودہ ہونے سے روکتا ہے، اور نتیجتاً کلینر کوڈ لکھنے کی حوصلہ افزائی کرتا ہے۔ گوگل سے متاثر امرود کلاس Optionalاب جاوا 8 کا حصہ ہے۔ Optionalیہ صرف ایک کنٹینر ہے: اس میں کوئی قدر یا کچھ قسم ہو سکتی ہے Т، یا صرف null ہو سکتی ہے۔ یہ بہت سے مفید طریقے فراہم کرتا ہے تاکہ واضح null چیک کو مزید جائز قرار نہ دیا جائے۔ مزید تفصیلی معلومات کے لیے سرکاری دستاویزات سے رجوع کریں ۔ آئیے استعمال کی دو چھوٹی مثالیں دیکھیں Optional: null کے ساتھ اور بغیر۔
Optional<String> fullName = Optional.ofNullable( null );
System.out.println( "Full Name is set? " + fullName.isPresent() );
System.out.println( "Full Name: " + fullName.orElseGet( () -> "[none]" ) );
System.out.println( fullName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
طریقہ درستisPresent() لوٹاتا ہے اگر مثال میں ایک غیر null قدر ہو اور دوسری صورت میں غلط ۔ طریقہ کار نتیجہ کے لیے ایک فال بیک میکانزم پر مشتمل ہے اگر اس میں null، ایک ڈیفالٹ قدر پیدا کرنے کے لیے فنکشنز کو قبول کرنا ہے۔ نقشہ () طریقہ موجودہ قدر کو تبدیل کرتا ہے اور ایک نئی مثال واپس کرتا ہے ۔ طریقہ اسی طرح ہے ، لیکن ایک فنکشن کے بجائے یہ ایک ڈیفالٹ قدر لیتا ہے. اس پروگرام کا آؤٹ پٹ یہ ہے: OptionalorElseGet()OptionalOptionalOptionalorElse()orElseGet()
Full Name is set? false
Full Name: [none]
Hey Stranger!
آئیے ایک اور مثال پر ایک سرسری نظر ڈالتے ہیں:
Optional<String> firstName = Optional.of( "Tom" );
System.out.println( "First Name is set? " + firstName.isPresent() );
System.out.println( "First Name: " + firstName.orElseGet( () -> "[none]" ) );
System.out.println( firstName.map( s -> "Hey " + s + "!" ).orElse( "Hey Stranger!" ) );
System.out.println();
نتیجہ اس طرح ہوگا:
First Name is set? true
First Name: Tom
Hey Tom!
مزید تفصیلی معلومات کے لیے، براہ کرم سرکاری دستاویزات سے رجوع کریں ۔

5.2 سلسلے

نیا شامل کردہ Stream API ( java.util.stream) جاوا میں حقیقی فنکشنل اسٹائل پروگرامنگ متعارف کراتا ہے۔ یہ جاوا لائبریری میں اب تک کا سب سے زیادہ جامع اضافہ ہے اور جاوا ڈویلپرز کو نمایاں طور پر زیادہ موثر ہونے کی اجازت دیتا ہے اور انہیں موثر، صاف اور جامع کوڈ بنانے کے قابل بھی بناتا ہے۔ Stream API مجموعوں کی پروسیسنگ کو بہت آسان بناتا ہے (لیکن ان تک محدود نہیں، جیسا کہ ہم بعد میں دیکھیں گے)۔ آئیے مثال کے طور پر ایک سادہ کلاس لیتے ہیں Task۔
public class Streams  {
    private enum Status {
        OPEN, CLOSED
    };

    private static final class Task {
        private final Status status;
        private final Integer points;

        Task( final Status status, final Integer points ) {
            this.status = status;
            this.points = points;
        }

        public Integer getPoints() {
            return points;
        }

        public Status getStatus() {
            return status;
        }

        @Override
        public String toString() {
            return String.format( "[%s, %d]", status, points );
        }
    }
}
ٹاسک میں پوائنٹس (یا چھدم مشکلات) کا کچھ احساس ہوتا ہے اور یہ کھلا یا بند ہوسکتا ہے ۔ آئیے مسائل کا ایک چھوٹا مجموعہ متعارف کراتے ہیں جن کے ساتھ کھیلنے کے لیے۔
final Collection<Task> tasks = Arrays.asList(
    new Task( Status.OPEN, 5 ),
    new Task( Status.OPEN, 13 ),
    new Task( Status.CLOSED, 8 )
);
پہلا سوال جس کا ہم یہ جاننے کا ارادہ رکھتے ہیں وہ یہ ہے کہ اوپن ٹاسک اس وقت کتنے پوائنٹس پر مشتمل ہیں؟ Java 8 سے پہلے، اس کا معمول کا حل یہ ہوتا ہے کہ استعمال کیا جائے iterator foreach۔ لیکن جاوا 8 میں، جواب اسٹریمز ہے: عناصر کا ایک سلسلہ جو ترتیب وار اور متوازی مجموعی کارروائیوں کی حمایت کرتا ہے۔
// Подсчет общего количества очков всех активных задач с использованием sum()
final long totalPointsOfOpenTasks = tasks
    .stream()
    .filter( task -> task.getStatus() == Status.OPEN )
    .mapToInt( Task::getPoints )
    .sum();

System.out.println( "Total points: " + totalPointsOfOpenTasks );
اور کنسول آؤٹ پٹ اس طرح نظر آئے گا:
Total points: 18
آئیے دیکھتے ہیں کہ یہاں کیا ہو رہا ہے۔ سب سے پہلے، ٹاسک کلیکشن کو اسٹریمنگ کی نمائندگی میں تبدیل کیا جاتا ہے۔ اس کے بعد آپریشن filterتمام کاموں کو بند حالت کے ساتھ فلٹر کرتا ہے ۔ اگلے مرحلے میں، آپریشن ہر مثال کے لیے ایک طریقہ استعمال کرتے ہوئے mapToIntسٹریم Tasks کو سٹریم s میں تبدیل کرتا ہے ۔ آخر میں، تمام نکات کا خلاصہ طریقہ استعمال کرتے ہوئے کیا جاتا ہے ، جو حتمی نتیجہ فراہم کرتا ہے۔ اگلی مثالوں پر جانے سے پہلے، ذہن میں رکھنے کے لیے دھاگوں کے بارے میں کچھ نوٹ ہیں (مزید تفصیلات یہاں )۔ آپریشنز کو انٹرمیڈیٹ اور فائنل آپریشنز میں تقسیم کیا گیا ہے ۔ انٹرمیڈیٹ آپریشنز ایک نیا سلسلہ واپس کرتے ہیں۔ وہ ہمیشہ سست ہوتے ہیں؛ جب درمیانی کارروائیاں انجام دیتے ہیں جیسے کہ ، وہ اصل میں فلٹرنگ نہیں کرتے ہیں، بلکہ اس کے بجائے ایک نیا سلسلہ بناتے ہیں، جو، مکمل ہونے پر، اصل دھارے کے عناصر پر مشتمل ہوتا ہے جو دی گئی پیش گوئی سے ملتا ہے۔ نتیجہ یا ضمنی اثر پیدا کرنے کے لیے محدود آپریشنز ، جیسے اور ، کو ایک دھارے سے گزارا جا سکتا ہے۔ ایک بار جب حتمی آپریشن مکمل ہو جاتا ہے، تو اس سلسلے کو استعمال شدہ سمجھا جاتا ہے اور اسے دوبارہ استعمال نہیں کیا جا سکتا۔ تقریباً تمام معاملات میں، اختتامی کارروائیاں بنیادی ڈیٹا سورس کے ذریعے اپنا ٹراورسل مکمل کرتی ہیں۔ تھریڈز کی ایک اور قابل قدر خصوصیت باکس کے باہر متوازی عمل کے لیے سپورٹ ہے۔ آئیے اس مثال کو دیکھتے ہیں، جس میں تمام مسائل کے سکور کا مجموعہ ملتا ہے۔ IntegerTask::getPointsTasksumstreamfilterforEachsum
// Calculate total points of all tasks
final double totalPoints = tasks
   .stream()
   .parallel()
   .map( task -> task.getPoints() ) // or map( Task::getPoints )
   .reduce( 0, Integer::sum );

System.out.println( "Total points (all tasks): " + totalPoints );
یہ پہلی مثال سے بہت ملتا جلتا ہے، سوائے اس کے کہ ہم تمام کاموں کو متوازی طور پر پروسیس کرنے کی کوشش کر رہے ہیں اور طریقہ استعمال کرتے ہوئے حتمی نتیجہ کا حساب لگا رہے ہیں reduce۔ یہاں کنسول آؤٹ پٹ ہے:
Total points (all tasks): 26.0
اکثر عناصر کو ایک خاص معیار کے مطابق گروپ کرنے کی ضرورت ہوتی ہے۔ مثال یہ ظاہر کرتی ہے کہ تھریڈز اس میں کس طرح مدد کر سکتے ہیں۔
// Группировка задач по их статусу
final Map<Status, List<Task>> map = tasks
    .stream()
    .collect( Collectors.groupingBy( Task::getStatus ) );
System.out.println( map );
کنسول آؤٹ پٹ اس طرح ہو گا:
{CLOSED=[[CLOSED, 8]], OPEN=[[OPEN, 5], [OPEN, 13]]}
مسئلے کی مثالوں کے ساتھ ختم کرنے کے لیے، آئیے کل پوائنٹس کی بنیاد پر مجموعہ میں ہر مسئلے کی مجموعی فیصد (یا وزن) کا حساب لگائیں:
// Подсчет веса каждой задачи (How процент от общего количества очков)
final Collection<String> result = tasks
    .stream()                                        // Stream<String>
    .mapToInt( Task::getPoints )                     // IntStream
    .asLongStream()                                  // LongStream
    .mapToDouble( points -> points / totalPoints )   // DoubleStream
    .boxed()                                         // Stream<Double>
    .mapToLong( weigth -> ( long )( weigth * 100 ) ) // LongStream
    .mapToObj( percentage -> percentage + "%" )      // Stream<String>
    .collect( Collectors.toList() );                 // List<String>

System.out.println( result );
کنسول آؤٹ پٹ اس طرح ہوگا:
[19%, 50%, 30%]
آخر میں، جیسا کہ ہم نے پہلے نوٹ کیا، اسٹریم API صرف جاوا کے مجموعوں کے لیے نہیں ہے۔ ایک عام I/O آپریشن، جیسا کہ ٹیکسٹ فائلز کو لائن بہ لائن پڑھنا، اسٹریم پروسیسنگ استعمال کرنے کے لیے بہت اچھا امیدوار ہے۔ اس کو ثابت کرنے کے لیے یہاں ایک چھوٹی سی مثال ہے۔
final Path path = new File( filename ).toPath();
try( Stream<String> lines = Files.lines( path, StandardCharsets.UTF_8 ) ) {
    lines.onClose( () -> System.out.println("Done!") ).forEach( System.out::println );
}
طریقہ onConsole، جسے تھریڈ پر کہا جاتا ہے، ایک اضافی پرائیویٹ ہینڈلر کے ساتھ مساوی دھاگہ لوٹاتا ہے۔ پرائیویٹ ہینڈلر کو اس وقت بلایا جاتا ہے جب close()تھریڈ پر کوئی طریقہ بلایا جاتا ہے۔ جاوا 8 میں پہلے سے طے شدہ اور جامد طریقوں کے ساتھ لیمبڈاس اور حوالہ کے طریقوں کے ساتھ اسٹریم API جدید سافٹ ویئر ڈویلپمنٹ پیراڈائمز کا جواب ہے۔ مزید تفصیلی معلومات کے لیے، براہ کرم سرکاری دستاویزات سے رجوع کریں ۔

5.3 تاریخ/وقت API (JSR 310)

Java 8 ایک نیا Date and Time API (JSR 310) فراہم کرکے تاریخ اور وقت کے نظم و نسق کو ایک نئی شکل دیتا ہے ۔ تاریخ اور وقت کی ہیرا پھیری جاوا ڈویلپرز کے لیے سب سے زیادہ دردناک پوائنٹس میں سے ایک ہے۔ java.util.Dateمندرجہ ذیل معیار نے java.util.Calendarعام طور پر صورتحال کو بہتر نہیں بنایا (شاید اسے مزید الجھا دیا جائے)۔ اسی طرح Joda-Time پیدا ہوا : Java کے لیے ایک زبردست تاریخ/وقت API متبادل ۔ Java 8 (JSR 310) میں نیا Date/Time API Joda-Time سے بہت زیادہ متاثر ہے اور اس سے بہترین فائدہ اٹھاتا ہے۔ نئے پیکیج میں تاریخ، وقت، تاریخ/وقت، ٹائم زون، دورانیے، اور وقت کی ہیرا پھیری کے لیے تمام کلاسزjava.time شامل ہیں ۔ API ڈیزائن نے تغیر پذیری کو بہت سنجیدگی سے لیا: تبدیلیوں کی اجازت نہیں ہے (ایک مشکل سبق جس سے سیکھا گیا ہے )۔ اگر ترمیم کی ضرورت ہو تو، متعلقہ کلاس کی ایک نئی مثال واپس کی جائے گی۔ آئیے ان کے استعمال کی اہم کلاسوں اور مثالوں کو دیکھیں۔ پہلی کلاس ، جو ٹائم زون کا استعمال کرتے ہوئے موجودہ فوری، تاریخ اور وقت تک رسائی فراہم کرتی ہے۔ اور کے بجائے استعمال کیا جا سکتا ہے ۔ java.util.CalendarClockClockSystem.currentTimeMillis()TimeZone.getDefault()
// Получить системное время How смещение UTC
final Clock clock = Clock.systemUTC();
System.out.println( clock.instant() );
System.out.println( clock.millis() );
کنسول آؤٹ پٹ کی مثال:
2014-04-12T15:19:29.282Z
1397315969360
دوسری نئی کلاسیں جو ہم دیکھیں گے وہ ہیں LocaleDateاور LocalTime. LocaleDateISO-8601 کیلنڈر سسٹم میں ٹائم زون کے بغیر صرف تاریخ کا حصہ ہوتا ہے۔ اس کے مطابق، LocalTimeاس میں ٹائم کوڈ کا صرف ایک حصہ ہے>۔
// получить местную date и время время
final LocalDate date = LocalDate.now();
final LocalDate dateFromClock = LocalDate.now( clock );

System.out.println( date );
System.out.println( dateFromClock );

// получить местную date и время время
final LocalTime time = LocalTime.now();
final LocalTime timeFromClock = LocalTime.now( clock );

System.out.println( time );
System.out.println( timeFromClock );
کنسول آؤٹ پٹ کی مثال:
2014-04-12
2014-04-12
11:25:54.568
15:25:54.568
LocalDateTimeISO-8601 کیلنڈر سسٹم میں ایک تاریخ اور وقت پر مشتمل ہے، لیکن کوئی ٹائم زون نہیں ہے LocaleDate۔ LocalTimeایک سادہ سی مثال ذیل میں دی گئی ہے۔
// Get the local date/time
final LocalDateTime datetime = LocalDateTime.now();
final LocalDateTime datetimeFromClock = LocalDateTime.now( clock );

System.out.println( datetime );
System.out.println( datetimeFromClock );
کنسول آؤٹ پٹ کی مثال:
2014-04-12T11:37:52.309
2014-04-12T15:37:52.309
اگر آپ کو کسی مخصوص ٹائم زون کے لیے تاریخ/وقت درکار ہے، ZonedDateTime۔ یہ ISO-8601 کیلنڈر سسٹم میں تاریخ اور وقت پر مشتمل ہے۔ مختلف ٹائم زونز کے لیے کچھ مثالیں یہ ہیں۔
// Получение даты/времени для временной зоны
final ZonedDateTime zonedDatetime = ZonedDateTime.now();
final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now( clock );
final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) );

System.out.println( zonedDatetime );
System.out.println( zonedDatetimeFromClock );
System.out.println( zonedDatetimeFromZone );
کنسول آؤٹ پٹ کی مثال:
2014-04-12T11:47:01.017-04:00[America/New_York]
2014-04-12T15:47:01.017Z
2014-04-12T08:47:01.017-07:00[America/Los_Angeles]
اور آخر میں، آئیے کلاس پر ایک نظر ڈالتے ہیں Duration: سیکنڈ اور نینو سیکنڈز میں ٹائم اسپین۔ اس سے دو تاریخوں کے درمیان حساب کتاب بہت آسان ہو جاتا ہے۔ آئیے دیکھتے ہیں کہ یہ کیسے کریں:
// Получаем разницу между двумя датами
final LocalDateTime from = LocalDateTime.of( 2014, Month.APRIL, 16, 0, 0, 0 );
final LocalDateTime to = LocalDateTime.of( 2015, Month.APRIL, 16, 23, 59, 59 );

final Duration duration = Duration.between( from, to );
System.out.println( "Duration in days: " + duration.toDays() );
System.out.println( "Duration in hours: " + duration.toHours() );
اوپر دی گئی مثال دو تاریخوں، اپریل 16، 2014 اور 16 اپریل، 2015 کے درمیان مدت (دن اور گھنٹوں میں) کا حساب لگاتی ہے ۔ یہاں کنسول آؤٹ پٹ کی ایک مثال ہے:
Duration in days: 365
Duration in hours: 8783
Java 8 میں نئی ​​تاریخ/وقت کا مجموعی تاثر بہت، بہت مثبت ہے۔ جزوی طور پر اس لیے کہ تبدیلیاں جنگ کی آزمائشی بنیاد (جوڈا ٹائم) پر مبنی ہیں، جزوی طور پر اس لیے کہ اس بار اس مسئلے پر سنجیدگی سے دوبارہ غور کیا گیا اور ڈویلپرز کی آوازیں سنی گئیں۔ تفصیلات کے لیے، براہ کرم سرکاری دستاویزات سے رجوع کریں ۔

5.4 ناشورن جاوا اسکرپٹ انجن

Java 8 نئے Nashorn JavaScript انجن کے ساتھ آتا ہے ، جو آپ کو JVM پر مخصوص قسم کے JavaScript ایپلی کیشنز تیار کرنے اور چلانے کی اجازت دیتا ہے۔ Nashorn JavaScript انجن javax.script.ScriptEngine کا ایک اور نفاذ ہے جو Java اور JavaScript کو بات چیت کرنے کی اجازت دینے کے لیے اصولوں کے ایک ہی سیٹ پر عمل کرتا ہے۔ یہاں ایک چھوٹی سی مثال ہے۔
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName( "JavaScript" );

System.out.println( engine.getClass().getName() );
System.out.println( "Result:" + engine.eval( "function f() { return 1; }; f() + 1;" ) );
کنسول آؤٹ پٹ کی مثال:
jdk.nashorn.api.scripting.NashornScriptEngine
Result: 2

5.5 بیس 64

آخر میں، Base64 انکوڈنگ کے لیے سپورٹ نے جاوا 8 کی ریلیز کے ساتھ جاوا معیاری لائبریری میں اپنا راستہ تلاش کیا۔ یہ استعمال کرنا بہت آسان ہے، مثال اس کو ظاہر کرتی ہے۔
package com.javacodegeeks.java8.base64;

import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class Base64s {
    public static void main(String[] args) {
        final String text = "Base64 finally in Java 8!";

        final String encoded = Base64
            .getEncoder()
            .encodeToString( text.getBytes( StandardCharsets.UTF_8 ) );
        System.out.println( encoded );

        final String decoded = new String(
            Base64.getDecoder().decode( encoded ),
            StandardCharsets.UTF_8 );
        System.out.println( decoded );
    }
}
پروگرام کا کنسول آؤٹ پٹ انکوڈ شدہ اور ڈی کوڈ ٹیکسٹ دونوں کو دکھاتا ہے:
QmFzZTY0IGZpbmFsbHkgaW4gSmF2YSA4IQ==
Base64 finally in Java 8!
یو آر ایل فرینڈلی انکوڈرز/ڈیکوڈرز کے ساتھ ساتھ MIME-دوستانہ انکوڈرز/ڈیکوڈرز ( Base64.getUrlEncoder()/ Base64.getUrlDecoder(), Base64.getMimeEncoder()/ Base64.getMimeDecoder()) کے لیے بھی کلاسز موجود ہیں۔

5.6 متوازی صفیں

جاوا 8 ریلیز متوازی سرنی پروسیسنگ کے لیے بہت سے نئے طریقے شامل کرتی ہے۔ شاید ان میں سے سب سے اہم ہے parallelSort()، جو ملٹی کور مشینوں پر چھانٹنے کو بہت تیز کر سکتا ہے۔ ذیل میں دی گئی چھوٹی مثال طریقوں کے نئے خاندان کو ظاہر کرتی ہے ( parallelXxx) عمل میں۔
package com.javacodegeeks.java8.parallel.arrays;

import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

public class ParallelArrays {
    public static void main( String[] args ) {
        long[] arrayOfLong = new long [ 20000 ];

        Arrays.parallelSetAll( arrayOfLong,
            index -> ThreadLocalRandom.current().nextInt( 1000000 ) );
        Arrays.stream( arrayOfLong ).limit( 10 ).forEach(
            i -> System.out.print( i + " " ) );
        System.out.println();

        Arrays.parallelSort( arrayOfLong );
        Arrays.stream( arrayOfLong ).limit( 10 ).forEach(
            i -> System.out.print( i + " " ) );
        System.out.println();
    }
}
کوڈ کا یہ چھوٹا ٹکڑا parallelSetAll()20,000 بے ترتیب اقدار کے ساتھ ایک صف کو بھرنے کے لیے ایک طریقہ استعمال کرتا ہے۔ اس کے بعد اس کا اطلاق ہوتا ہے parallelSort()۔ یہ پروگرام ترتیب دینے سے پہلے اور بعد میں پہلے 10 عناصر کو پرنٹ کرتا ہے تاکہ یہ ظاہر کیا جا سکے کہ ارے اصل میں ترتیب دی گئی ہے۔ مثال کے طور پر پروگرام آؤٹ پٹ اس طرح نظر آتا ہے (نوٹ کریں کہ صف کے عناصر بے ترتیب ہیں)۔
Unsorted: 591217 891976 443951 424479 766825 351964 242997 642839 119108 552378
Sorted: 39 220 263 268 325 607 655 678 723 793

5.7 متوازی

java.util.concurrent.ConcurrentHashMapنئے شامل کردہ اسٹریم آبجیکٹ اور لیمبڈا ایکسپریشنز کی بنیاد پر مجموعی کارروائیوں کو سپورٹ کرنے کے لیے کلاس میں نئے طریقے شامل کیے گئے ہیں ۔ مشترکہ پولنگ کو سپورٹ کرنے کے لیے کلاس میں نئے طریقے بھی شامل کیے گئے ہیں ( جاوا کنکرنسی پرjava.util.concurrent.ForkJoinPool ہمارا مفت کورس بھی دیکھیں )۔ پڑھنے/لکھنے کے کنٹرول کے لیے تین رسائی طریقوں کے ساتھ اہلیت پر مبنی لاکنگ فراہم کرنے کے لیے ایک نئی کلاس شامل کی گئی ہے (اسے بہت اچھا نہ ہونے کا ایک بہتر متبادل سمجھا جا سکتا ہے )۔ نئی کلاسیں جو پیکج میں شامل کی گئی ہیں : java.util.concurrent.locks.StampedLockjava.util.concurrent.locks.ReadWriteLockjava.util.concurrent.atomic
  • ڈبل جمع کرنے والا
  • ڈبل ایڈر
  • لمبی جمع کرنے والا
  • لانگ ایڈر

6. جاوا رن ٹائم ماحول میں نئی ​​خصوصیات (JVM)

علاقے کو PermGenریٹائر کر دیا گیا ہے اور اس کی جگہ میٹا اسپیس (JEP 122) نے لے لی ہے ۔ JVM کے اختیارات -XX:PermSizeاور بالترتیب اور -XX:MaxPermSizeان کی جگہ لے لی گئی ہے ۔ -XX:MetaSpaceSize-XX:MaxMetaspaceSize

7. نتیجہ

مستقبل یہاں ہے: Java 8 نے اپنے پلیٹ فارم کو ایسی خصوصیات فراہم کرکے آگے بڑھایا ہے جو ڈویلپرز کو زیادہ پیداواری ہونے کی اجازت دیتی ہے۔ پروڈکشن سسٹمز کو جاوا 8 میں منتقل کرنا ابھی بہت جلدی ہے، لیکن اگلے چند مہینوں میں اسے اپنانا آہستہ آہستہ بڑھنا شروع ہو جانا چاہیے۔ تاہم، اب وقت آگیا ہے کہ جاوا 8 مطابقت کے لیے اپنے کوڈ بیس کی تیاری شروع کریں اور جاوا 8 کی تبدیلیوں کو شامل کرنے کے لیے تیار رہیں جب یہ کافی محفوظ اور مستحکم ہو۔ جاوا 8 کی کمیونٹی کی قبولیت کے ثبوت کے طور پر، Pivotal نے حال ہی میں Java 8 کے لیے پروڈکشن سپورٹ کے ساتھ Spring Framework جاری کیا ۔ آپ جاوا 8 میں دلچسپ نئی خصوصیات کے بارے میں تبصروں میں اپنا ان پٹ فراہم کر سکتے ہیں۔

8. ذرائع

کچھ اضافی وسائل جو جاوا 8 خصوصیات کے مختلف پہلوؤں پر گہرائی میں بحث کرتے ہیں:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION