JavaRush /Java Blog /Random-TK /Java 8 aýratynlyklary - Iň soňky gollanma (1-nji bölüm)
0xFF
Dereje
Донецк

Java 8 aýratynlyklary - Iň soňky gollanma (1-nji bölüm)

Toparda çap edildi
Makalanyň terjimesiniň birinji bölümi Java 8 aýratynlyklary - ULTIMATE gollanmasy . Ikinji bölüm şu ýerde (baglanyşyk üýtgäp biler). Java 8 aýratynlyklary - Iň soňky gollanma (1-nji bölüm) - 1 Redaktoryň belligi : Bu makala Java 8 köpçülige elýeterli bolanda neşir edildi we ähli görkezijiler munuň hakykatdanam esasy wersiýadygyny görkezýär. Bu ýerde Java Code Geeks gollanmalaryny hödürledik, Java 8 bilen oýnamak - Lambdas we Concurrency , Java 8 Sene we Wagt API gollanmasy: Java 8 Era-da LocalDateTime we Abstract Class vs. Interfeýs . Şeýle hem , beýleki çeşmelerden hökman okalmaly Java 8 okuw gollanmasyna baglanyşýarys . Elbetde , Java 8-iň Dark Side ýaly käbir oňaýsyz taraplaryna seredýäris . Şeýlelik bilen, amatly bolmagy üçin Java 8-iň esasy aýratynlyklaryny bir ýerde ýygnamagyň wagty geldi. Lezzet al!

1. Tanyşdyryş

Şübhesiz, Java 8-iň çykmagy Java 5-den bäri iň uly waka (ep-esli wagt öň, 2004-nji ýylda çykdy). Java-da dilde, düzüjide, kitaphanalarda, gurallarda we JVM-de (Java Virtual Machine) köp täze aýratynlyklar getirdi. Bu gollanmada, bu üýtgeşmelere göz aýlarys we hakyky durmuş mysallary bilen dürli ulanylyş ýagdaýlaryny görkezeris. Gollanma birnäçe bölekden ybarat bolup, olaryň her biri platformanyň belli bir tarapyna degişlidir:
  • Dil
  • Düzediji
  • Kitaphanalar
  • Gurallar
  • Iş wagty (JVM)

2. Java 8-de täze aýratynlyklar

Her niçigem bolsa, Java 8 esasy goýberişdir. Her Java döredijiniň gözleýän aýratynlyklarynyň durmuşa geçirilmegi sebäpli şeýle köp wagt alandygyny aýdyp bileris. Bu bölümde olaryň köpüsini öz içine alarys.

2.1. Lambdas we funksional interfeýsler

Lambdas (hususy ýa-da näbelli usullar diýlip hem atlandyrylýar) Java 8 çykarylyşynyň iň uly we garaşylýan dil üýtgemegi bolup durýar. Bize usul argumenti hökmünde (töweregindäki funksiýany yglan etmek bilen) ýa-da kody maglumat hökmünde kesgitlemäge mümkinçilik berýär. : her bir işläp düzüjiniň tanyş düşünjeleri . programmirleme _ JVM platformasyndaky köp dilde (Groowy, Scala , ...) birinji günden başlap lambdalar bardy, ýöne Java döredijiler lambdalary näbelli synplar arkaly görkezmekden başga alajy ýokdy. Lambdalaryň dizaýnyny ara alyp maslahatlaşmak halkdan köp wagt we güýç sarp etdi. Eventuallyöne ahyrsoňy täze gysga dizaýnlaryň döremegine sebäp bolan ylalaşyklar tapyldy. Iň ýönekeý görnüşinde, lambda vergul bilen bölünen parametrleriň sanawy, a -> nyşan we jisim hökmünde görkezilip bilner . Mysal üçin:
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) )
E argumentiniň görnüşiniň düzüji tarapyndan kesgitlenýändigine üns beriň. Mundan başga-da, parametri gabygyň içine salyp, parametriň görnüşini aç-açan kesgitläp bilersiňiz. Mysal üçin:
Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );
Lambda bedeni has çylşyrymly bolsa, Java-da adaty funksiýa kesgitlemesine meňzeş egri ýaýlar bilen örtülip bilner. Mysal üçin:
Arrays.asList( "a", "b", "d" ).forEach( e -< {
    System.out.print( e );
    System.out.print( e );
} );
finalLambda synp agzalaryna we ýerli üýtgeýjilere ýüzlenip biler ( meýdana girip-girmändigine garamazdan jaňy täsirli edýär ). Mysal üçin, bu 2 bölek deňdir:
String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
    ( String e ) -> System.out.print( e + separator ) );
WE:
final String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
    ( String e ) -> System.out.print( e + separator ) );
Lambdas bir bahany yzyna gaýtaryp biler. Yza gaýtarma görnüşi düzüji tarapyndan kesgitlener. returnLambdanyň bedeni bir setirden ybarat bolsa, beýannama talap edilmeýär. Aşakdaky iki kod parçasy deňdir:
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
WE:
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
    int result = e1.compareTo( e2 );
    return result;
} );
Dil döredijiler, bar bolan funksiýalary lambda-dostlukly etmek barada köp wagtlap pikir etdiler. Netijede, işleýän interfeýs düşünjesi ýüze çykdy. Funksiýa interfeýsi diňe bir usul bilen interfeýsdir. Netijede, lambda aňlatmasyna doly öwrülip biler. java.lang.Runnablewe java.util.concurrent.Callablefunksional interfeýsleriň iki sany ajaýyp mysaly. Iş ýüzünde, funksional interfeýsler gaty gowşak: kimdir biri interfeýs kesgitlemesine başga bir usul goşsa, ol mundan beýläk işlemez we düzmek prosesi gutarmaz. Bu gowşaklygyň öňüni almak we interfeýsiň niýetini funksional diýip kesgitlemek üçin Java 8-de ýörite düşündiriş goşuldy @FunctionalInterface(Java kitaphanasyndaky ähli interfeýsler @FunctionalInterface düşündirişini aldy). Funksiýa interfeýsiniň bu ýönekeý kesgitlemesine seredeliň:
@FunctionalInterface
public interface Functional {
    void method();
}
Inatda saklamaly bir zat bar: deslapky usullar we statiki usullar funksional interfeýs prinsipini bozmaýar we yglan edilip bilner:
@FunctionalInterface
public interface FunctionalDefaultMethods {
    void method();

    default void defaultMethod() {
    }
}
“Lambdas” “Java 8” -iň iň meşhur aýratynlygydyr. Bu ajaýyp platforma has köp döredijini çekmek we arassa Java-daky aýratynlyklar üçin akylly goldaw bermek üçin ähli mümkinçilikleri bar. Has giňişleýin maglumat üçin resmi resminamalara ýüz tutmagyňyzy haýyş edýäris .

2.2. Bellenen interfeýsler we statiki usullar

Java 8 iki täze düşünje bilen interfeýsleriň kesgitlemesini giňeltdi: deslapky usul we statiki usul. Bellenen usullar interfeýsleri häsiýetlere birneme meňzeýär, ýöne birneme başga maksat bilen hyzmat edýär. Bar bolan interfeýslere şol interfeýsleriň ozal ýazylan wersiýalary üçin yza gabat gelmezden täze usullary goşmaga mümkinçilik berýär. Adaty usullar bilen abstrakt usullaryň arasyndaky tapawut, abstrakt usullaryň ýerine ýetirilmeli, deslapky usullar ýok bolsa. Muňa derek, her interfeýs deslapky ýerine ýetiriş diýlip atlandyrylmalydyr we ähli nesiller ony deslapky görnüşde alarlar (zerur bolsa bu ýerine ýetirilişi ýok etmek ukyby bilen). Aşakdaky mysala seredeliň.
private interface Defaulable {
    // Интерфейсы теперь разрешают методы по умолчанию,
    // клиент может реализовывать  (переопределять)
    // or не реализовывать его
    default String notRequired() {
        return "Default implementation";
    }
}

private static class DefaultableImpl implements Defaulable {
}

private static class OverridableImpl implements Defaulable {
    @Override
    public String notRequired() {
        return "Overridden implementation";
    }
}
Interfeýs, usul kesgitlemesiniň bir bölegi hökmünde açar söz ulanyp, Defaulabledeslapky usuly yglan edýär . Sapaklaryň biri, bu interfeýsi bolşy ýaly deslapky usuly goýýar. Başga bir synp, deslapky ýerine ýetirişiň üstünden barýar we özüne mahsus üpjün edýär. Java 8-de girizilen başga bir gyzykly aýratynlyk, interfeýsleriň statiki usullary yglan edip (we durmuşa geçirmegi teklip edip biler). Ine bir mysal: notRequired()defaultDefaultableImplOverridableImpl
private interface DefaulableFactory {
    // Interfaces now allow static methods
    static Defaulable create( Supplier<Defaulable> supplier ) {
        return supplier.get();
    }
}
Kodyň kiçi bölegi, ýokardaky mysaldan deslapky usuly we statiki usuly birleşdirýär:
public static void main( String[] args ) {
    Defaulable defaulable = DefaulableFactory.create( DefaultableImpl::new );
    System.out.println( defaulable.notRequired() );

    defaulable = DefaulableFactory.create( OverridableImpl::new );
    System.out.println( defaulable.notRequired() );
}
Bu programmanyň konsol çykyşy şeýle:
Default implementation
Overridden implementation
JVM-de deslapky usuly ýerine ýetirmek gaty täsirli we usuly çagyrmak bytekod görkezmeleri bilen goldanýar. Bellenen usullar, bar bolan Java interfeýslerini düzmek prosesini bozman ösmäge mümkinçilik berdi. Gowy mysallar interfeýsde goşulan köp usuldyr java.util.Collection: stream(),,,, ... Güýçli parallelStream()bolsa -da, deslapky usullary seresaplylyk bilen ulanmaly: deslapky usuly yglan etmezden ozal munuň hakykatdanam zerurdygy ýa-da ýokdugy barada iki gezek forEach()pikirlenmeli removeIf()çylşyrymly iýerarhiýalarda düşnüksizlikleri we ýalňyşlyklary düzmek. Has giňişleýin maglumat üçin resminamalara serediň .

2.3. Salgylanma usullary

Salgylanma usullary, Java synplarynyň ýa-da obýektleriniň (mysallarynyň) bar bolan usullaryna ýa-da konstruktorlaryna salgylanmak üçin peýdaly sintaksis amala aşyrýar. Lambda aňlatmalary bilen bilelikde salgylanma usullary dil gurluşyny ykjam we gysga edýär we şablon esasly edýär. Aşakda dürli usul kesgitlemeleriniň mysaly hökmünde synp bar Car, geliň goldanýan dört usul görnüşini belläliň:
public static class Car {
    public static Car create( final Supplier<Car> supplier ) {
        return supplier.get();
    }

    public static void collide( final Car car ) {
        System.out.println( "Collided " + car.toString() );
    }

    public void follow( final Car another ) {
        System.out.println( "Following the " + another.toString() );
    }

    public void repair() {
        System.out.println( "Repaired " + this.toString() );
    }
}
Birinji salgylanma usuly sintaksisli konstruktora Class::newýa-da generika üçin alternatiwa Class< T >::new. Konstruktoryň hiç hili argumentiniň ýokdugyna üns beriň.
final Car car = Car.create( Car::new );
final List<Car> cars = Arrays.asList( car );
Ikinji wariant, sintaksis bilen statiki usula salgylanma Class::static_method. Usulyň görnüşiň takyk bir parametrini alýandygyna üns beriň Car.
cars.forEach( Car::collide );
Üçünji görnüş, sintaksis bilen belli bir görnüşdäki özbaşdak obýektiň mysaly usulyna salgylanma Class::method. Usul bilen hiç hili argumentiň kabul edilmeýändigini unutmaň.
cars.forEach( Car::repair );
Iň soňky, dördünji görnüş bolsa sintaksis bilen belli bir synpyň mysalyna salgylanma instance::method. Usulyň diňe bir görnüşi kabul edýändigini ýadyňyzdan çykarmaň Car.
final Car police = Car.create( Car::new );
cars.forEach( police::follow );
Java programmalary hökmünde bu mysallaryň hemmesini işletmek aşakdaky konsol çykyşyny döredýär (synp salgysy Carüýtgäp biler):
Collided com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d
Repaired com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d
Following the com.javacodegeeks.java8.method.references.MethodReferences$Car@7a81197d
Has giňişleýin maglumat we salgylanma usullarynyň jikme-jiklikleri üçin resmi resminamalara ýüz tutmagyňyzy haýyş edýäris .

2.4. Annotasiýalary köpeltmek

Java 5 düşündirişler üçin goldaw hödürlänsoň , bu aýratynlyk gaty meşhur boldy we giňden ulanyldy. Şeýle-de bolsa, düşündirişleri ulanmagyň çäklendirmelerinden biri, şol bir düşündirişiň bir ýerde bir gezekden köp gezek yglan edilip bilinmezligi. Java 8 bu düzgüni bozýar we iki gezek düşündiriş berýär. Bu, şol bir düşündirişleriň yglan edilen ýerinde birnäçe gezek gaýtalanmagyna mümkinçilik berýär. Dublikat düşündirişler düşündiriş ulanyp özlerini düşündirmeli @Repeatable. Aslynda, bu dilde beýle üýtgeşiklik däl, sebäbi düzüji hiledir, tehnika öňküligine galýar. Simpleönekeý bir meselä seredeliň:
package com.javacodegeeks.java8.repeatable.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

public class RepeatingAnnotations {
    @Target( ElementType.TYPE )
    @Retention( RetentionPolicy.RUNTIME )
    public @interface Filters {
        Filter[] value();
    }

    @Target( ElementType.TYPE )
    @Retention( RetentionPolicy.RUNTIME )
    @Repeatable( Filters.class )
    public @interface Filter {
        String value();
    };

    @Filter( "filter1" )
    @Filter( "filter2" )
    public interface Filterable {
    }

    public static void main(String[] args) {
        for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) {
            System.out.println( filter.value() );
        }
    }
}
Görşümiz ýaly, synp @Repeatable (Filtrler ) Filterbilen düşündirilýär . diňe düşündirişleriň eýesidir , ýöne Java düzüjisi öz barlygyny döredijilerden gizlemäge synanyşýar. Şeýlelikde, interfeýsde iki gezek yglan edilýän bellikler bar (ýatlamazdan ). Şeýle hem, Reflection API haýsydyr bir görnüşdäki dublikat bellikleri yzyna gaýtarmak üçin täze usul bilen üpjün edýär (Filterable .getAnnotation (Filters. ) Kompilýator sanjylýan mysaly yzyna gaýtaryp berjekdigini ýadyňyzdan çykarmaň ). Programmanyň çykyşy şeýle bolar: classFiltersFilterFilterableFilterFiltersgetAnnotationsByType()classclassFilters
filter1
filter2
Has giňişleýin maglumat üçin resmi resminamalara ýüz tutmagyňyzy haýyş edýäris .

2.5. Kämilleşdirilen görnüş

Java 8 düzüjisi köp görnüşli gowulaşma aldy. Köp ýagdaýlarda aç-açan görnüş parametrleri düzüji tarapyndan kesgitlenip, kod arassalanýar. Bir mysala seredeliň:
package com.javacodegeeks.java8.type.inference;

public class Value<T> {
    public static<T> T defaultValue() {
        return null;
    }

    public T getOrDefault( T value, T defaultValue ) {
        return ( value != null ) ? value : defaultValue;
    }
}
Ine, görnüşi bilen ulanylyşy Value<String>:
package com.javacodegeeks.java8.type.inference;

public class TypeInference {
    public static void main(String[] args) {
        final Value<String> value = new Value<>();
        value.getOrDefault( "22", Value.defaultValue() );
    }
}
Görnüşiň parametri Value.defaultValue()awtomatiki kesgitlenýär we aç-açan berilmeli däl. Java 7-de şol bir mysal düzülmez we <NOBR> Gymmat. <String> defaultValue () </NOBR> görnüşinde täzeden ýazylmalydyr.

2.6. Giňeldilen düşündiriş goldawy

Java 8 düşündirişleriň ulanyp boljak mazmunyny giňeldýär. Häzirki wagtda hemme zadyň diýen ýaly düşündirişi bolup biler: ýerli üýtgeýjiler, umumy görnüşler, superklasslar we ýerine ýetirilen interfeýsler, hatda usul kadadan çykmalar. Aşakda birnäçe mysal getirilýär:
package com.javacodegeeks.java8.annotations;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Collection;

public class Annotations {
    @Retention( RetentionPolicy.RUNTIME )
    @Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )
    public @interface NonEmpty {
    }

    public static class Holder<@NonEmpty T> extends @NonEmpty Object {
        public void method() throws @NonEmpty Exception {
        }
    }

    @SuppressWarnings( "unused" )
    public static void main(String[] args) {
        final Holder<String> holder = new @NonEmpty Holder<String>();
        @NonEmpty Collection<@NonEmpty String> strings = new ArrayList<>();
    }
}
ElementType.TYPE_USEwe ElementType.TYPE_PARAMETERdegişli düşündiriş mazmunyny beýan etmek üçin iki sany täze element görnüşi. Annotation Processing APIJava-da täze düşündiriş görnüşlerini tanamak üçin ownuk üýtgeşmeler hem boldy.

3. Java düzüjisinde täze aýratynlyklar

3.1. Parametr atlary

Wagtyň dowamynda Java döredijiler usul parametrleriniň atlaryny iş wagty elýeterli etmek üçin (mysal üçin, Paranamer kitaphanasy ) Java kod kodunda saklamagyň dürli usullaryny oýlap tapdylar . Netijede, Java 8 bu kyn funksiýany dilde (Reflection API we usuly ulanyp ) we bytekodda (täze düzüjiniň argumentini ulanyp :) döredýär . Parameter.getName()javac–parameters
package com.javacodegeeks.java8.parameter.names;

import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

public class ParameterNames {
    public static void main(String[] args) throws Exception {
        Method method = ParameterNames.class.getMethod( "main", String[].class );
        for( final Parameter parameter: method.getParameters() ) {
            System.out.println( "Parameter: " + parameter.getName() );
        }
    }
}
Bu synpy argument ulanman düzüp –parameters, soňam programmany işletseňiz, şuňa meňzeş bir zady görersiňiz:
Parameter: arg0
Parametr –parametersdüzüjä geçensoň, programmanyň çykyşy başgaça bolar (parametriň hakyky ady görkeziler):
Parameter: args
Öňdebaryjy “Maven” ulanyjylary üçin “Parametrler” argumentini bölümiň kömegi bilen goşup bolýar maven-compiler-plugin:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
    <compilerArgument>-parameters</compilerArgument>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
</plugin>
isNamePresent()Parametr atlarynyň elýeterliligini barlamak üçin synp tarapyndan hödürlenýän amatly usul bar Parameter.

4. Täze Java gurallary

Java 8 buýruk setiri gurallarynyň täze toplumy bilen gelýär. Bu bölümde olaryň iň gyzyklysyna serederis.

4.1. Naşorn dwigateli: jjs

jjs buýruk setirine esaslanýan özbaşdak Nashorn hereketlendirijisidir. JavaScript deslapky kod faýllarynyň sanawyny alýar we işleýär. Mysal üçin, aşakdaky mazmunly func.js faýly döredeliň :
function f() {
     return 1;
};

print( f() + 1 );
Bu faýly işletmek üçin jjs- a argument hökmünde geçeliň :
jjs func.js
Konsol çykyşy şeýle bolar:
2
Has giňişleýin maglumat üçin resminamalara serediň .

4.2. Synpa baglylyk analizatory: jdeps

jdeps hakykatdanam ajaýyp buýruk setir guralydyr. Java synplary üçin bukjany ýa-da synp derejesine baglylygy görkezýär. Giriş hökmünde .class faýly, bukjany ýa-da JAR faýly kabul edýär . Düzgüne görä , jdeps standart çykaryşa (konsol) garaşlylygy çykarýar. Mysal hökmünde, meşhur Bahar Çarçuwaly kitaphanasynyň garaşlylyk hasabatyna seredeliň . Mysal gysga saklamak üçin, diňe JAR faýlyna baglylyklara seredeliň org.springframework.core-3.0.5.RELEASE.jar.
jdeps org.springframework.core-3.0.5.RELEASE.jar
Bu buýruk gaty köp çykýar, şonuň üçin çykyşyň diňe bir bölegini seljereris. Baglylyklar paketler boýunça toparlanýar. Baglanyşyk ýok bolsa, tapylmaz .
org.springframework.core-3.0.5.RELEASE.jar -> C:\Program Files\Java\jdk1.8.0\jre\lib\rt.jar
   org.springframework.core (org.springframework.core-3.0.5.RELEASE.jar)
      -> java.io
      -> java.lang
      -> java.lang.annotation
      -> java.lang.ref
      -> java.lang.reflect
      -> java.util
      -> java.util.concurrent
      -> org.apache.commons.logging                         not found
      -> org.springframework.asm                            not found
      -> org.springframework.asm.commons                    not found
   org.springframework.core.annotation (org.springframework.core-3.0.5.RELEASE.jar)
      -> java.lang
      -> java.lang.annotation
      -> java.lang.reflect
      -> java.util
Has giňişleýin maglumat üçin resmi resminamalara ýüz tutmagyňyzy haýyş edýäris .
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION