بخشی از پاورپوینت

اسلاید 1 :

امکانات جدید جاوا در نسخه 8Java 8 Features

اسلاید 3 :

سرفصل مطالب
در جاوا 8 چه اتفاقاتی افتاده است؟
چرا جاوا 8 نسخه مهمی است؟
عبارت لامبدا (Lambda Expression)
برنامهنویسی تابعی (Functional Programming)
واسط تابعی (Functional Interface)
جویبار (Stream)
جویبارهای موازی (Parallel Streams)
امکانات جدید و گسترده کتابخانهی جاوا 8

اسلاید 4 :

در جاوا 8 چه اتفاقاتی افتاده است؟
معرفی عبارتهای لامبدا
ارجاع به متد
متغیرهایی که به متدها اشاره میکنند
برنامهنویسی با رویکرد تابعی ممکن شده است
برنامههایی که کوتاهتر و گویاتر هستند
معرفی مفهوم جویبار و جویبار موازی
برای پردازش دنبالهای از دادهها
امکانات بسيار گستردهای با کمک مفاهیم فوق ایجاد شده است
که باعث تسهیل برنامهنویسی میشوند

اسلاید 5 :

چرا جاوا 8 نسخه مهمی است؟
جاوا 8 گستردهترين تغییر در تاریخ «زبان جاوا» است
حتی گستردهتر از جاوا 5
که ساختارهای مهمی مانند Generic و Annotation را معرفی کرد

برنامهنويس بهجای چگونگی انجام کار، میتواند فقط هدف کار را توصیف کند
“what to do” instead of “how to do”

اسلاید 6 :

چرا جاوا 8 نسخه مهمی است؟ (ادامه )
برنامهنویس جاوا 8 ، میتواند به صورت «تابعی» بیاندیشد
Functional Programming
Thinking Functional
این تغییر، در عمر جاوا بیسابقه است
برنامهنویس جاوا عادت کرده که شیءگرا فکر کند
جاوا 8 کتابخانه و API زبان را گسترش داده و تقویت کرده است
نیاز به کتابخانههای کمکی (مثل Apache Commons) کمتر میشود
با معرفی جاوا 8 ، دستخط برنامهنویسی جاوا به مرور تغییر خواهد کرد
اگر دانش جاوا 8 نداشته باشیم، بسياری از کدها را نخواهیم فهمید

اسلاید 7 :

مروری بر مفاهیم جدید در جاوا 8
An Overview of Java 8 Features

اسلاید 8 :

متدهای پیشفرض برای واسطها
یک واسط (interface):
همانند کلاسی است که همه متدهای آن انتزاعی (abstract) هستند
از جاوا 8 به بعد، یک واسط میتواند متدهای غیرانتزاعی داشته باشد
به این متدها، متد پیشفرض (Default Method) گفته میشود.
مثال:
interface Person {
Date getBirthDate();
default Integer age(){
long diff = new Date().getTime()-getBirthDate().getTime();
return (int) (diff / (1000L*60*60*24*365));
}
}

اسلاید 9 :

class Student implements Person {
private Date birthDate;
public Date getBirthDate() {
return birthDate;
}
@Override
public Integer age() {
long yearMiliSeconds = 1000L * 60 * 60 * 24 * 365;
long currentYear = new Date().getTime() / yearMiliSeconds;
long birthYear = getBirthDate().getTime() / yearMiliSeconds;
return (int) (currentYear - birthYear);
}
}
ارثبری از متد پیشفرض
تعريف متد پیشفرض در کلاسهایی که واسط را پیادهسازی میکنند، اجباری نیست
class Student implements Person {
private Date birthDate;
public Date getBirthDate() {return birthDate;}
}

اسلاید 10 :

واسط تابعی (Functional Interface)
واسطی که دقیقاً یک متد انتزاعی (abstract) دارد
اگر بیش از یک متد دارد، یا تعدادی متد را به ارث گرفته است:
همه این متدها، به جز یکی، باید تعریف پیشفرض داشته باشند
interface A {}
interface B {
int f();
}
interface C {
int f();
int g();
}
interface D extends B {
int g();
}
interface E extends B {
default double g(){ return 2;}
}
بالای تعريف یک واسط تابعی، میتوانیم @FunctionalInterface را ذکر کنیم
@FunctionalInterface
@FunctionalInterface

اسلاید 11 :

عبارت لامبدا (Lambda Expression)
لامبدا یا لاندا ( λ )
یک عبارت لامبدا:
قطعهکدی است که بدنه یک تابع را توصيف میکند
و به عنوان یک واسط تابعی قابل استفاده است
public interface Comparator {
int compare(T o1, T o2);
{
Comparator comp =
(a,b) -> a.age().compareTo(b.age());
یک عبارت لامبدا
زيرا هر واسط تابعی، فقط یک متد نامشخص (انتزاعی) دارد
مثال:
r -> r*2*3.14 (x,y) -> x+y

اسلاید 12 :

مثال: کاربرد عبارتهای لامبدا
List people = Arrays.asList(
new Student("Ali", 1993),
new Student("Taghi", 1990),
new Student("Naghi", 1995));
Collections.sort(people,
new Comparator() {
@Override
public int compare(Person a, Person b) {
return a.age().compareTo(b.age());
}
});
Collections.sort(people,
(a, b) -> a.age().compareTo(b.age()));
اشاره: یک عبارت لامبدا به یک کلاس داخلی بینام ترجمه نمیشود

اسلاید 13 :

Str str = new Str();
Converter conv = str::startsWith;
Character converted = conv.convert("Java");
ارجاع به متد (Method Reference)
امکانی جدید در جاوا 8 که مانند اشارهگر به متد عمل میکند
از :: برای ارجاع به متد استفاده میشود

هر جا که یک واسط تابعی موردنیاز باشد:
میتوانیم از ارجاعبهمتد (و یا یک عبارت لامبدا) استفاده کنیم
interface Converter {
T convert(F from);
}
class Str {
Character startsWith(String s) {
return s.charAt(0);
}
}
ارجاع به متد
@FunctionalInterface

اسلاید 14 :

مثال برای ارجاع به متد
ارجاع به متد

ارجاع به متد استاتیک

ارجاع به سازنده (Constructor)
Converter converter = Integer::valueOf;
Converter conv = str::startsWith;
interface Factory {
T create();
}
Factory factory1 = Car::new;
Car car1 = factory1.create();

اسلاید 15 :

واسطهای تابعی جدید در جاوا 8
Java 8 Functional Interfaces

اسلاید 16 :

واسطهای تابعی تعبیهشده در جاوا8
واسطهای تابعی مختلف و مفیدی در جاوا8 (JDK 1.8) ایجاد شده
بسياری از واسطهای مهم و معروف قبلی، واسط تابعی شدهاند
مانند Comparator و Runnable
واسطهای تابعی جدیدی هم معرفی شدهاند
مانند: Predicate، Function، Supplier و Consumer
در بسته java.util.function قرار دارند
مثلاً java.util.function.Predicate

اسلاید 17 :

مثال برای Comparator
در جاوا 8 متدهای پیشفرض جدیدی به این واسط اضافه شده است
Comparator comparator =
(p1, p2) -> p1.getName().compareTo(p2.getName());

Person p1 = new Person("Ali");
Person p2 = new Person("Taghi");

comparator.compare(p1, p2); // < 0
comparator.reversed().compare(p1, p2); // > 0

اسلاید 18 :

Predicate
یک واسط تابعی است: یک پارامتر میگیرد و boolean برمیگرداند
این واسط، متدهای پیشفرض مختلفی دارد
مانند test برای ارزيابی و and ، or و negate برای ترکیب Predictae ها
String st = "ok";
boolean b;
Predicate notEmpty = (x) -> x.length() > 0;
b = notEmpty.test(st); // true
b = notEmpty.negate().test(st); // false
Predicate notNull = x -> x != null;
b = notNull.and(notEmpty).test(st); // true
Predicate isEmpty = String::isEmpty;
Predicate isNotEmpty = isEmpty.negate();

اسلاید 19 :

Function
تابعی است که یک پارامتر میگیرد و یک خروجی تولید میکند
با متد apply این تابع اجرا میشود
متدهای پیشفرضی مانند andThen برای ترکیب زنجیروار تابعها
Function toInteger =
Integer::valueOf;

Function backToString =
toInteger.andThen(String::valueOf);

backToString.apply("123"); // "123"

اسلاید 20 :

Supplier
تابعی که یک شیء تولید (تأمین) میکند
(برخلاف Function) هیچ پارامتری نمیگیرد
اجرای تابع: با کمک متد get
Supplier personSupplier = Person::new;
personSupplier.get(); // new Person

در متن اصلی پاورپوینت به هم ریختگی وجود ندارد. برای مطالعه بیشتر پاورپوینت آن را خریداری کنید