JavaRush /Блоги Java /Random-TG /Аз 8 то 13: шарҳи пурраи версияҳои Java. Қисми 1

Аз 8 то 13: шарҳи пурраи версияҳои Java. Қисми 1

Дар гурӯҳ нашр шудааст
Гурбачахо, ба ҳама салом)) Ҳамин тавр, имрӯз мо соли 2020 ҳастем ва то баровардани Java 14 хеле кам мондааст. Шумо бояд versionи анҷомёфтаро 17 март интизор шавед, мо пас аз воқеа он чизеро, ки тару тоза ва ҷолиб аст, таҳлил хоҳем кард, аммо имрӯз ман мехоҳам хотираи худро дар versionҳои қаблии Java навсозӣ кунам. Онҳо ба мо чӣ нав оварданд? Биёед бубинем. Биёед баррасиро бо Java 8 оғоз кунем, зеро он ҳоло ҳам хеле муҳим аст ва дар аксари лоиҳаҳо истифода мешавад. Аз 8 то 13: шарҳи пурраи versionҳои Java.  Қисми 1 - 1Пештар, versionҳои нав ҳар 3-5 сол бароварда мешуданд, аммо ба наздикӣ Oracle равиши дигарро пеш гирифт - "Java-и нав дар шаш моҳ." Ҳамин тариқ, ҳар шаш моҳ мо нашри хусусиятҳоро мебинем. Новобаста аз он ки ин хуб аст ё бад, ҳама онро ба таври гуногун мебинанд. Масалан, ба ман ин хеле маъқул нест, зеро versionҳои нав дорои хусусиятҳои нав нестанд, аммо дар айни замон, versionҳо мисли занбурўғҳо пас аз борон афзоиш меёбанд. Ман дар як лоиҳа бо Java 8 чанд маротиба чашмак задам ва Java 16 аллакай бароварда шуда буд (аммо вақте ки он хеле кам мебарояд, хусусиятҳои нав ҷамъ мешаванд ва дар ниҳоят ин ҳодиса ба мисли ид деринтизор мешавад: ҳама неъматҳои нав ва шумо наметавонед аз он гузаред) . Пас биёед оғоз кунем!

Java 8

Интерфейси функсионалӣ

Ин чи аст? Интерфейси функсионалӣ интерфейсест, ки дорои як усули иҷронашуда (абстрактӣ) мебошад. @FunctionalInterface як тавзеҳи ихтиёрӣ аст, ки дар болои чунин интерфейс ҷойгир шудааст. Барои санҷидани он, ки оё он ба талаботи интерфейси функсионалӣ мувофиқат мекунад (танҳо як усули абстрактӣ дорад). Аммо чун ҳамеша, мо баъзе огоҳиҳо дорем: усулҳои пешфарз ва статикӣ ба ин талаботҳо дохил намешаванд. Аз ин рӯ, метавонад якчанд чунин усулҳо + як абстрактӣ вуҷуд дошта бошанд ва интерфейс функсионалӣ хоҳад буд. Он инчунин метавонад усулҳои синфи Object дошта бошад, ки ба таърифи интерфейс ҳамчун функсионалӣ таъсир намерасонанд. Ман дар бораи усулҳои пешфарз ва статикӣ чанд калима илова мекунам:
  1. Усулҳо бо тағирдиҳандаи пешфарз ба шумо имкон медиҳанд, ки усулҳои навро ба интерфейсҳо бидуни вайрон кардани татбиқи мавҷудаи онҳо илова кунед.

    public interface Something {
      default void someMethod {
          System.out.println("Some text......");
      }
    }

    Бале, бале, мо усули амалӣшударо ба интерфейс илова мекунем ва ҳангоми татбиқи ин усул, шумо наметавонед онро бекор кунед, балки онро ҳамчун усули меросӣ истифода баред. Аммо агар синф ду интерфейсро бо усули додашуда амалӣ созад, мо хатои ҷамъоварӣ хоҳем дошт ва агар он интерфейсҳоро амалӣ кунад ва синфро бо усули муайяни шабеҳ мерос гирад, усули синфи волидайн усулҳои интерфейсро такрор мекунад ва истисно кор намекунад.

  2. усулҳои статикӣ дар интерфейс ҳамон усулҳои статикӣ дар синф кор мекунанд. Фаромӯш накунед: шумо наметавонед усулҳои статикиро мерос гиред , ҳамон тавре ки шумо усули статикиро аз синфи насл даъват карда наметавонед.

Пас, чанд сухани дигар дар бораи интерфейсҳои функсионалӣ ва биёед идома диҳем. Инҳоянд рӯйхати асосии FI (боқимонда навъҳои онҳо):

    Предикат - арзиши T-ро ҳамчун аргумент мегирад, мантиқиро бармегардонад.

    Мисол:boolean someMethod(T t);

  • Истеъмолкунанда - аргументи навъи T мегирад, чизе барнамегардонад (беэътибор).

    Мисол:void someMethod(T t);

  • Таъминкунанда - чизеро ҳамчун вуруд қабул намекунад, аммо арзиши T-ро бармегардонад.

    Мисол:T someMethod();

  • Функсия - параметри навъи T-ро ҳамчун вуруд қабул мекунад, арзиши навъи R-ро бармегардонад.

    Мисол:R someMethod(T t);

  • UnaryOperator - далели T мегирад ва арзиши навъи T-ро бармегардонад.

    Мисол:T 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);

}
Чунин ба назар мерасад, ки codeи зиёд вуҷуд надорад ва мантиқ аллакай каме печида аст. Биёед бубинем, ки он бо истифода аз ҷараён чӣ гуна хоҳад буд:
Stream.of(46, 34, 24, 93, 91, 1, 34, 94)

      .filter(x -> x < 50)

      .map(x -> x + 5)

      .limit(4)

      .forEach(System.out::print);
Ҷараёнҳо тавассути кам кардани миқдори code ва хондантар кардани он ҳаётро хеле содда мекунанд. Барои онҳое, ки мехоҳанд ин мавзӯъро муфассалтар омӯзанд, дар ин ҷо як мақолаи хуб (ҳатто ман мегӯям, ки аъло) дар ин мавзӯъ аст .

Ламбда

Шояд хусусияти муҳимтарин ва деринтизор ин пайдоиши ламбдаҳо бошад. Ламбда чист? Ин як блоки рамзест, ки метавонад ба ҷойҳои гуногун интиқол дода шавад, то он қадар дертар иҷро карда шавад. Хеле печида садо медиҳад, ҳамин тавр не? Оддӣ карда гӯем, бо истифода аз ламбдаҳо, шумо метавонед як усули интерфейси функсионалӣ (як навъ татбиқи синфи беном) амалӣ кунед:
Runnable runnable = () -> { System.out.println("I'm running !");};

new Thread(runnable).start();
Мо усули run()-ро зуд ва бидуни расмиёти нолозим ба кор бурдем. Ва ҳа: Runnable интерфейси функсионалӣ аст. Ман инчунин ламбдаҳоро ҳангоми кор бо ҷараёнҳо истифода мебарам (ба мисли мисолҳои ҷараёнҳои дар боло овардашуда). Мо хеле амиқ намеравем, зеро мо метавонем хеле амиқ ғарқ шавем, ман якчанд истинод мегузорам, то бачаҳое, ки ҳанӯз дар дил кофтаанд, амиқтар кобед:

foreach

Java 8 дорои foreach нав аст, ки бо ҷараёни додаҳо ба мисли ҷараён кор мекунад. Инак як мисол:
List<Integer> someList = Arrays.asList(1, 3, 5, 7, 9);

someList.forEach(x -> System.out.println(x));
(аналогӣ ба someList.stream().foreach(…))

Истинод аз усул

Усулҳои истинод як синтаксиси нав ва муфид мебошанд, ки барои истинод ба усулҳо ё созандагони синфҳои Java ё an objectҳои мавҷуда тавассути :: истинодҳои методӣ дар чор намуд пешбинӣ шудаанд:
  1. Истинод ба дизайнер:

    SomeObject obj = SomeObject::new

  2. Истиноди усули статикӣ:

    SomeObject::someStaticMethod

  3. Истинод ба усули ғайристатикии an objectи навъи муайян:

    SomeObject::someMethod

  4. Истинод ба усули муқаррарии (ғайристатикӣ) an objectи мушаххас

    obj::someMethod

Аксар вақт, истинодҳои методӣ дар ҷараёнҳо ба ҷои ламбдаҳо истифода мешаванд (усулҳои истинод нисбат ба ламбдаҳо тезтаранд, аммо дар хонданашон пасттаранд).
someList.stream()

        .map(String::toUpperCase)

      .forEach(System.out::println);
Барои онҳое, ки мехоҳанд маълумоти бештар дар бораи усулҳои истинод:

Вақти API

Китобхонаи нав барои кор бо сана ва вақт мавҷуд аст - java.time. Аз 8 то 13: шарҳи пурраи versionҳои Java.  Қисми 1 - 2API-и нав ба ҳама гуна Joda-Time монанд аст. Қисмҳои муҳимтарини ин API инҳоянд:
  • LocalDate санаи мушаххас аст, ҳамчун мисол - 2010-01-09;
  • LocalTime - вақт бо назардошти минтақаи вақт - 19:45:55 (аналогӣ ба LocalDate);
  • LocalDateTime - омехтаи LocalDate + LocalTime - 2020-01-04 15:37:47;
  • ZoneId - минтақаҳои вақтро ифода мекунад;
  • Соат - бо истифода аз ин намуд шумо метавонед ба вақт ва санаи ҷорӣ дастрасӣ пайдо кунед.
Инҳоянд чанд мақолаи ҷолиб дар ин мавзӯъ:

Ихтиёрӣ

Ин як синфи нав дар бастаи java.util аст , парпечкунандаи арзиш, ки ҳиллаест, ки он инчунин метавонад бехатарии null -ро дар бар гирад . Гирифтани ихтиёрӣ: Агар мо Optional<String> someOptional = Optional.of("Something"); дар Optional.of null гузорем , мо NullPointerException дӯстдоштаи худро мегирем . Барои чунин ҳолатҳо онҳо истифода мебаранд: 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")); Шумо метавонед барои муддати хеле ва хеле дароз идома диҳед ( хушбахтона, Опсия усулҳоро бо ҳарду дасти саховатманд илова кардааст), аммо мо дар ин бора таваққуф намекунем. Барои ман беҳтар аст, ки якчанд истинодро барои шурӯъкунандагон тарк кунам: Мо аз навовариҳои машҳур дар Java 8 гузаштем - ин ҳама нест. Агар шумо хоҳед, ки маълумоти бештар гиред, ман инро барои шумо гузоштам:

Java 9

Ҳамин тавр, 21 сентябри соли 2017 ҷаҳон JDK 9-ро дид. Ин Java 9 дорои маҷмӯи ғании хусусиятҳо мебошад. Гарчанде ки мафҳумҳои нави забон вуҷуд надоранд, API-ҳои нав ва фармонҳои ташхис бешубҳа ба таҳиягарон таваҷҷӯҳ хоҳанд кард. Аз 8 то 13: шарҳи пурраи versionҳои Java.  Қисми 1 - 4

JShell (REPL - ҳалқаи хондан-баҳодиҳӣ-чоп)

Ин татбиқи Java-и консоли интерактивӣ мебошад, ки барои санҷиши функсияҳо ва истифодаи конструксияҳои гуногун дар консол, ба монанди интерфейсҳо, синфҳо, рақамҳо, операторҳо ва ғайра истифода мешавад. Барои оғоз кардани JShell, шумо танҳо бояд дар терминал jshell нависед. Он гоҳ мо метавонем ҳар чизеро, ки тасаввуроти мо имкон медиҳад, нависем: Аз 8 то 13: шарҳи пурраи versionҳои Java.  Кисми 1 — 5Бо истифода аз JShell, шумо метавонед усулҳои сатҳи олиро эҷод кунед ва онҳоро дар як сессия истифода баред. Усулҳо мисли усулҳои статикӣ кор хоҳанд кард, ба истиснои он ки калимаи калидии статикиро метавон партофт.. Муфассалтар дар дастури Java 9. REPL (JShell) хонед .

хусусӣ

Аз versionи 9-и Java сар карда, мо имкон дорем, ки усулҳои хусусиро дар интерфейсҳо истифода барем (усулҳои пешфарз ва статикӣ, зеро мо наметавонем дигаронро аз сабаби дастрасии нокифоя бекор кунем). private static void someMethod(){} try-with-resources Қобorяти коркарди истисноҳои Кӯшиш бо захираҳо такмил дода шуд:
BufferedReader reader = new BufferedReader(new FileReader("....."));
  try (reader2) {
  ....
}

Модулият ( Jigsaw )

Модул як гурӯҳи бастаҳо ва захираҳои алоқаманд бо файли тавсифкунандаи модули нав мебошад. Ин равиш барои суст кардани пайванди code истифода мешавад. Пайвастшавии фуҷур омor асосии нигоҳдорӣ ва васеъшавии code мебошад. Модулият дар сатҳҳои гуногун амалӣ карда мешавад:
  1. Забони барномасозӣ.
  2. Мошини виртуалӣ.
  3. API-и стандартии java.
JDK 9 бо 92 модул меояд: мо метавонем онҳоро истифода барем ё худамонро эҷод кунем. Инҳоянд чанд истинод барои дидани амиқтар:

Маҷмӯаи тағирнопазир

Дар Java 9 имкон пайдо шуд, ки коллексия бо як сатр эҷод ва пур карда шавад, дар ҳоле ки онро тағирнопазир гардонем (қаблан барои сохтани коллексияи тағирнашаванда ба мо лозим буд, ки коллексия эҷод кунем, онро бо маълумот пур кунем ва методро даъват кунем, масалан, Collections.unmodifiableList). Намунаи чунин офариниш: List someList = List.of("first","second","third");

Дигар инноватсияҳо:

  • васеъ Ихтиёрӣ (усулҳои нав илова карда шудааст);
  • интерфейсҳои ProcessHandle ва ProcessHandle барои назорат кардани амалҳои системаи оператсионӣ пайдо шуданд;
  • G1 - коллектори партовҳои пешфарз;
  • Мизоҷи HTTP бо дастгирии ҳам протоколҳои HTTP/2 ва WebSocket;
  • ҷараёни васеъ;
  • чаҳорчӯбаи Reactive Streams API илова карда шуд (барои барномасозии реактивӣ);
Барои пурратар ғарқ шудан дар Java 9, ман ба шумо маслиҳат медиҳам, ки хонед:

Java 10

Ҳамин тавр, пас аз шаш моҳи нашри Java 9, дар моҳи марти соли 2018 (ман онро дирӯз дар ёд дорам), Java 10 ба саҳна баромад. Аз 8 то 13: шарҳи пурраи versionҳои Java.  Қисми 1 - 6

var

Ҳоло ба мо лозим нест, ки навъи маълумотро пешниҳод кунем. Мо паёмро ҳамчун var қайд мекунем ва компилятор навъи паёмро аз рӯи намуди оғозкунандаи дар тарафи рост мавҷудбуда муайян мекунад. Ин хусусият танҳо барои тағирёбандаҳои маҳаллӣ бо инициализатор дастрас аст: онро барои аргументҳои методӣ, намудҳои баргардонидан ва ғайра истифода бурдан мумкин нест, зеро ягон инициализатор вуҷуд надорад, ки намуди онро муайян кунад. Намунаи var (барои навъи String):
var message = "Some message…..";
System.out.println(message);
var калимаи калидӣ нест: он аслан номи навъи маҳфуз аст, мисли int . Манфиати var бузург аст: эъломияҳои навъи бе ягон фоида таваҷҷӯҳи зиёдро ҷалб мекунанд ва ин хусусият вақтро сарфа мекунад. Аммо дар айни замон, агар тағирёбанда аз занҷири дарози усулҳо ба даст оварда шавад, code камтар хондашаванда мешавад, зеро дарҳол маълум нест, ки чӣ гуна an object дар он ҷо ҷойгир аст. Ба онҳое, ки мехоҳанд бо ин функсия шинос шаванд, бахшида шудааст:

Компилятори JIT (GraalVM)

Бе тафсири бештар, ба шумо хотиррасон мекунам, ки вақте ки шумо фармони javac-ро иҷро мекунед, барномаи Java аз codeи Java ба JVM bytecode, ки намояндагии дуии барнома мебошад, тартиб дода мешавад. Аммо протсессори компютерии муқаррарӣ наметавонад bytecodeи JVM-ро иҷро кунад. Барои он ки барномаи JVM-и шумо кор кунад, ба шумо компилятори дигар барои ин bytecode лозим аст, ки он ба рамзи мошин табдил дода мешавад, ки протсессор аллакай аз он истифода бурда метавонад. Дар муқоиса бо javac, ин компилятор хеле мураккабтар аст, аммо инчунин рамзи мошини сифати баландтар истеҳсол мекунад. Дар айни замон, OpenJDK дорои мошини виртуалии HotSpot мебошад, ки дар навбати худ ду компилятори асосии JIT дорад. Якум, C1 ( компилятори муштарӣ ) барои суръати баландтар тарҳрезӣ шудааст, аммо оптимизатсияи code азият мекашад. Дуюм C2 (компилятори server) мебошад. Суръати иҷроиш азият мекашад, аммо code бештар оптимизатсия шудааст. Кадомаш кай истифода мешавад? C1 барои барномаҳои мизи корӣ, ки дар он таваққуфҳои тӯлонии JIT номатлуб аст, бузург аст ва C2 барои барномаҳои serverи дарозмуддат, ки вақти бештарро барои таҳия кардан сарф кардан қобor қабул аст, бузург аст. Ҷамъоварии бисёрсатҳа ин аст, ки компиляция аввал аз C1 мегузарад ва натиҷа аз C2 мегузарад (барои оптимизатсияи бештар истифода мешавад). GraalVM лоиҳаест, ки барои пурра иваз кардани HotSpot сохта шудааст. Мо метавонем дар бораи Graal ҳамчун якчанд лоиҳаҳои алоқаманд фикр кунем: компилятори нави JIT барои HotSpot ва як мошини нави виртуалии полиглот. Хусусияти ин компилятори JIT дар он аст, ки он дар Java навишта шудааст. Бартарии компилятори Graal бехатарӣ аст, яъне на садамаҳо, балки истисноҳо, на ихроҷи хотира. Мо инчунин дастгирии хуби IDE хоҳем дошт ва мо метавонем debuggers, profilers ё дигар асбобҳои мувофиқро истифода барем. Илова бар ин, компилятор метавонад аз HotSpot мустақил бошад ва он метавонад versionи зудтари JIT-ро эҷод кунад. Барои кофтуковчиён:

Параллели G1

Ҷамъоварии партовҳои G1 бешубҳа олиҷаноб аст, бешубҳа, он як нуқтаи заиф дорад: он як давраи пурраи GC-ро иҷро мекунад. Дар замоне, ки ба шумо тамоми қувваи сахтафзор лозим аст, ки шумо метавонед барои пайдо кардани an objectҳои истифоданашуда ҷамъ кунед, мо бо як риштаи ягона маҳдудем. Java 10 инро ислоҳ кард. Ҳоло GC бо тамоми захираҳое, ки мо ба он илова мекунем кор мекунад (яъне он бисёр ришта мешавад). Барои ноил шудан ба ин, таҳиягарони забон ҷудокунии манбаъҳои асосиро аз GC такмил дода, интерфейси хуби тоза барои GC эҷод карданд. Таҳиягарони ин зебоӣ, OpenJDK, бояд партовро дар code тоза кунанд, то на танҳо эҷоди GC-ҳои навро то ҳадди имкон содда кунанд, балки имкон диҳанд, ки GC-ҳои нолозим аз маҷлис зуд хомӯш карда шаванд. Яке аз меъёрҳои асосии муваффақият ин набудани пастшавии суръати кор пас аз ҳамаи ин беҳбудиҳо мебошад. Биёед инчунин бубинем: Дигар инноватсияҳо:
  1. Интерфейси тозаи партовҳои коллекторӣ ҷорӣ карда мешавад. Ин ҷудокунии codeи сарчашмаро аз коллекторҳои гуногуни партов беҳтар мекунад ва имкон медиҳад коллекторҳои алтернативӣ зуд ва бедард муттаҳид карда шаванд;
  2. Якҷоя кардани манбаъҳои JDK дар як анбор;
  3. Коллексияҳо усули нав гирифтанд - copyOf (Коллектив) , ки нусхаи тағирнопазири ин коллексияро бармегардонад;
  4. Ихтиёрӣ (ва вариантҳои он) дорои усули нави .orElseThrow() ;
  5. Минбаъд, JVMҳо медонанд, ки онҳо дар як контейнери Docker кор мекунанд ва ба ҷои дархости худи системаи оператсионӣ конфигуратсияи мушаххаси контейнерро дарёфт мекунанд.
Инҳоянд чанд маводи дигар барои муқаддимаи муфассал бо Java 10: Ман пештар аз он хеле ошуфта шудам, ки баъзе versionҳои Java 1.x номида мешаванд. Ман мехоҳам равшан бошам: versionҳои Java пеш аз 9 танҳо схемаи номгузории дигар доштанд. Масалан, Java 8-ро 1.8 , Java 5 - 1.5 ва ғайра низ метавон номид. Ва ҳоло мо мебинем, ки бо гузаштан ба релизҳо аз Java 9 схемаи номгузорӣ низ тағйир ёфтааст ва versionҳои Java дигар бо 1.x префикс гузошта намешаванд. . Ин охири қисми аввал аст: мо хусусиятҳои нави ҷолиби java 8-10-ро дида баромадем. Биёед шиносоии худро бо охирин дар мақолаи навбатӣ идома диҳем .
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION