JavaRush /مدونة جافا /Random-AR /دليل جافا 8. الجزء 2.
ramhead
مستوى

دليل جافا 8. الجزء 2.

نشرت في المجموعة

تاريخ API

يحتوي Java 8 على واجهات برمجة تطبيقات التاريخ والوقت الجديدة تمامًا في حزمة java.time. واجهة برمجة تطبيقات Date الجديدة قابلة للمقارنة بمكتبة Joda-Time ، ولكنها ليست نفسها. ستغطي الأمثلة التالية الأجزاء الأكثر أهمية في واجهة برمجة التطبيقات الجديدة.
ساعة
الساعة تتيح الوصول إلى التاريخ والوقت الحاليين. تدرك الساعات المناطق الزمنية وبالتالي يمكن استخدامها بدلاً من System.currentTimeMillis() لإرجاع الوقت الحالي بالمللي ثانية. يتم تمثيل هذا النوع من دقة الوقت أيضًا بواسطة الفئة الفورية . يمكن استخدام المراسلات الفورية لإنشاء كائنات java.util.Date الموروثة . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
المناطق الزمنية
يتم تمثيل المناطق الزمنية بواسطة الفئة المجردة ZoneId . ويمكن الوصول إليها بسهولة باستخدام أساليب المصنع الإحصائي. تحدد المناطق الزمنية الإزاحات المهمة للتحويل بين التاريخ والوقت الفوري والمحلي. System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
الوقت المحلي
يعرض LocalTime الوقت بدون منطقة زمنية، على سبيل المثال 17:30:15. يقوم المثال التالي بإنشاء كائنين للتوقيت المحلي للمناطق الزمنية المحددة أعلاه. ثم نقارن بين الجسمين ونحسب الفرق بالساعات والدقائق بينهما. LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239 يأتي LocalTime مزودًا بطرق مصنعية متنوعة لتسهيل إنشاء مثيل، بما في ذلك تحليل السلسلة. LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37
التاريخ المحلي
يعرض LocalDate تاريخًا محددًا، على سبيل المثال 2014-03-11. المثيلات غير قابلة للتغيير وتعمل بشكل مشابه لـ LocalTime. يوضح المثال كيفية حساب تاريخ جديد عن طريق إضافة أو طرح أيام أو أشهر أو سنوات. ضع في اعتبارك أن كل عملية على كائن ما تُرجع كائنًا جديدًا. LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY يعد تحليل LocalDate من سلسلة أمرًا بسيطًا مثل تحليل LocalTime: DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24
LocalDateTime
يعرض LocalDateTime التاريخ والوقت. هذا مزيج من التاريخ والوقت المذكورين أعلاه، في نسخة واحدة. مثيلات LocalDateTime غير قابلة للتغيير وتعمل بشكل مشابه لـ LocalTime وLocalDate. يمكننا استخدام طرق لاسترداد قيم خصائص المثيل التي نحتاجها: LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439 جنبًا إلى جنب مع معلومات المنطقة الزمنية الإضافية، يمكن تحويل المثيل إلى فوري. يمكن تحويل المراسلات الفورية بسهولة إلى الأنواع القديمة الموروثة من java.util.Date. Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 يعمل تنسيق التاريخ والوقت بنفس طريقة تنسيق التاريخ أو الوقت. بدلاً من استخدام تنسيقات التاريخ المحددة مسبقًا، يمكننا استخدام التنسيقات المحددة يدويًا. DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13 على عكس java.text.NumberFormat، فإن DateTimeFormatter الجديد غير قابل للتغيير وآمن لمؤشر الترابط. لمزيد من المعلومات حول بناء جملة تنسيقات الكتابة، اقرأ هنا .

الشروح

التعليقات التوضيحية في Java 8 قابلة للتكرار. دعونا نلقي نظرة على مثال لتوضيح كيفية عمل ذلك. للبدء، سنقوم بتعريف غلاف التعليقات التوضيحية الذي يخزن مجموعة من التعليقات التوضيحية الصالحة: @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } يتيح لنا Java 8 استخدام تعليقات توضيحية متعددة من نفس النوع عن طريق الإعلان عن التعليق التوضيحي @Repeatable. الخيار 1: استخدام التعليقات التوضيحية للحاوية (المدرسة القديمة) (يتيح لنا Java 8 استخدام التعليقات التوضيحية المتعددة من نفس النوع عن طريق الإعلان عن تعليق توضيحي @Repeatable .) الخيار 1: استخدام حاوية التعليقات التوضيحية (المدرسة القديمة) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} الخيار 2: استخدام التعليقات التوضيحية القابلة للتكرار ( ميزة جديدة) @Hint("hint1") @Hint("hint2") class Person {} باستخدام الخيار الثاني، يقوم مترجم Java بتعيين التعليق التوضيحي @Hint ضمنيًا. يعد هذا أمرًا مهمًا لقراءة معلومات التعليقات التوضيحية من خلال التفكير. Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2 على الرغم من أننا لم نعلن عن التعليق التوضيحي @Hints لفئة الشخص ، إلا أنه يمكن قراءته باستخدام طريقة getAnnotation(Hints.class) . ومع ذلك، هناك طريقة أكثر ملاءمة وهي getAnnotationsByType ، والتي توفر الوصول إلى جميع التعليقات التوضيحية باستخدام التعليق التوضيحي @Hint . بالإضافة إلى ذلك، يتسع استخدام التعليقات التوضيحية في Java 8 إلى غرضين: @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

هذا كل شيء

اكتمل البرنامج التعليمي لبرمجة Java 8. إذا كنت تريد معرفة المزيد حول جميع الفئات الجديدة وميزات واجهة برمجة التطبيقات (API) في JDK 8، فما عليك سوى قراءة مقالتي التالية. سيساعدك هذا على فهم جميع الفئات الجديدة والميزات المخفية في JDK 8، مثل Arrays.parallelSort و StampedLock و CompletableFuture .
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION