欧美日韩亚-欧美日韩亚州在线-欧美日韩亚洲-欧美日韩亚洲第一区-欧美日韩亚洲二区在线-欧美日韩亚洲高清精品

金喜正规买球

超強(qiáng)干貨!Java 8 新特性介紹終極版

轉(zhuǎn)帖|使用教程|編輯:我只采一朵|2016-03-17 10:49:04.000|閱讀 759 次

概述:毫無(wú)疑問(wèn),Java 8是Java自Java 5(發(fā)布于2004年)之后的最重要的版本。這個(gè)版本包含語(yǔ)言、編譯器、庫(kù)、工具和JVM等方面的十多個(gè)新特性。在本文中我們將學(xué)習(xí)這些新特性,并用實(shí)際的例子說(shuō)明在什么場(chǎng)景下適合使用。本文翻譯自Java 8 Features Tutorial – The ULTIMATE Guide。

# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>

相關(guān)鏈接:

前言: Java 8 已經(jīng)發(fā)布很久了,很多報(bào)道表明Java 8 是一次重大的版本升級(jí)。在Java Code Geeks上已經(jīng)有很多介紹Java 8新特性的文章,例如、和。本文還參考了一些其他資料,例如:和。本文綜合了上述資料,整理成一份關(guān)于Java 8新特性的參考教材,希望你有所收獲。

1. 簡(jiǎn)介

毫無(wú)疑問(wèn),Java 8是Java自Java 5(發(fā)布于2004年)之后的最重要的版本。這個(gè)版本包含語(yǔ)言、編譯器、庫(kù)、工具和JVM等方面的十多個(gè)新特性。在本文中我們將學(xué)習(xí)這些新特性,并用實(shí)際的例子說(shuō)明在什么場(chǎng)景下適合使用。

這個(gè)教程包含Java開(kāi)發(fā)者經(jīng)常面對(duì)的幾類(lèi)問(wèn)題:

  • 語(yǔ)言
  • 編譯器
  • 庫(kù)
  • 工具
  • 運(yùn)行時(shí)(JVM)

2. Java語(yǔ)言的新特性

Java 8是Java的一個(gè)重大版本,有人認(rèn)為,雖然這些新特性領(lǐng)Java開(kāi)發(fā)人員十分期待,但同時(shí)也需要花不少精力去學(xué)習(xí)。在這一小節(jié)中,我們將介紹Java 8的大部分新特性。

2.1 Lambda表達(dá)式和函數(shù)式接口

Lambda表達(dá)式(也稱(chēng)為) 是Java 8中最大和最令人期待的語(yǔ)言改變。它允許我們將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼本身當(dāng)作數(shù)據(jù)處理:函數(shù)式開(kāi)發(fā)者非常熟悉這些概念。很多JVM平臺(tái) 上的語(yǔ)言(Groovy、Scala等)從誕生之日就支持Lambda表達(dá)式,但是Java開(kāi)發(fā)者沒(méi)有選擇,只能使用匿名內(nèi)部類(lèi)代替Lambda表達(dá)式。

Lambda的設(shè)計(jì)耗費(fèi)了很多時(shí)間和很大的社區(qū)力量,最終找到一種折中的實(shí)現(xiàn)方案,可以實(shí)現(xiàn)簡(jiǎn)潔而緊湊的語(yǔ)言結(jié)構(gòu)。最簡(jiǎn)單的Lambda表達(dá)式可由逗號(hào)分隔的參數(shù)列表、->符號(hào)和語(yǔ)句塊組成,例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

在上面這個(gè)代碼中的參數(shù)e的類(lèi)型是由編譯器推理得出的,你也可以顯式指定該參數(shù)的類(lèi)型,例如:

Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );

如果Lambda表達(dá)式需要更復(fù)雜的語(yǔ)句塊,則可以使用花括號(hào)將該語(yǔ)句塊括起來(lái),類(lèi)似于Java中的函數(shù)體,例如:

Arrays.asList( "a", "b", "d" ).forEach( e -> {      System.out.print( e );      System.out.print( e );  } );

Lambda表達(dá)式可以引用類(lèi)成員和局部變量(會(huì)將這些變量隱式得轉(zhuǎn)換成final的),例如下列兩個(gè)代碼塊的效果完全相同:

String separator = ",";  Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.print( e + separator ) );

final String separator = ",";  Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.print( e + separator ) );

Lambda表達(dá)式有返回值,返回值的類(lèi)型也由編譯器推理得出。如果Lambda表達(dá)式中的語(yǔ)句塊只有一行,則可以不用使用return語(yǔ)句,下列兩個(gè)代碼片段效果相同:

Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );

Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {      int result = e1.compareTo( e2 ); return result;  } );

Lambda的設(shè)計(jì)者們?yōu)榱俗尙F(xiàn)有的功能與Lambda表達(dá)式良好兼容,考慮了很多方法,于是產(chǎn)生了這個(gè)概念。函數(shù)接口指的是只有一個(gè)函數(shù)的接口,這樣的接口可以隱式轉(zhuǎn)換為L(zhǎng)ambda表達(dá)式。java.lang.Runnablejava.util.concurrent.Callable是函數(shù)式接口的最佳例子。在實(shí)踐中,函數(shù)式接口非常脆弱:只要某個(gè)開(kāi)發(fā)者在該接口中添加一個(gè)函數(shù),則該接口就不再是函數(shù)式接口進(jìn)而導(dǎo)致編譯失敗。為了克服這種代碼層面的脆弱性,并顯式說(shuō)明某個(gè)接口是函數(shù)式接口,Java 8 提供了一個(gè)特殊的注解@FunctionalInterface(Java 庫(kù)中的所有相關(guān)接口都已經(jīng)帶有這個(gè)注解了),舉個(gè)簡(jiǎn)單的函數(shù)式接口的定義:

@FunctionalInterface public interface Functional { void method();  }

不過(guò)有一點(diǎn)需要注意,不會(huì)破壞函數(shù)式接口的定義,因此如下的代碼是合法的。

@FunctionalInterface public interface FunctionalDefaultMethods { void method(); default void defaultMethod() {                  }          }

Lambda表達(dá)式作為Java 8的最大賣(mài)點(diǎn),它有潛力吸引更多的開(kāi)發(fā)者加入到JVM平臺(tái),并在純Java編程中使用函數(shù)式編程的概念。如果你需要了解更多Lambda表達(dá)式的細(xì)節(jié),可以參考。

2.2 接口的默認(rèn)方法和靜態(tài)方法

Java 8使用兩個(gè)新概念擴(kuò)展了接口的含義:默認(rèn)方法和靜態(tài)方法。使得接口有點(diǎn)類(lèi)似traits,不過(guò)要實(shí)現(xiàn)的目標(biāo)不一樣。默認(rèn)方法使得開(kāi)發(fā)者可以在 不破壞二進(jìn)制兼容性的前提下,往現(xiàn)存接口中添加新的方法,即不強(qiáng)制那些實(shí)現(xiàn)了該接口的類(lèi)也同時(shí)實(shí)現(xiàn)這個(gè)新加的方法。

默認(rèn)方法和抽象方法之間的區(qū)別在于抽象方法需要實(shí)現(xiàn),而默認(rèn)方法不需要。接口提供的默認(rèn)方法會(huì)被接口的實(shí)現(xiàn)類(lèi)繼承或者覆寫(xiě),例子代碼如下:

private interface Defaulable { // Interfaces now allow default methods, the implementer may or  // may not implement (override) them. 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";      }  }

Defaulable接口使用關(guān)鍵字default定義了一個(gè)默認(rèn)方法notRequired()DefaultableImpl類(lèi)實(shí)現(xiàn)了這個(gè)接口,同時(shí)默認(rèn)繼承了這個(gè)接口中的默認(rèn)方法;OverridableImpl類(lèi)也實(shí)現(xiàn)了這個(gè)接口,但覆寫(xiě)了該接口的默認(rèn)方法,并提供了一個(gè)不同的實(shí)現(xiàn)。

Java 8帶來(lái)的另一個(gè)有趣的特性是在接口中可以定義靜態(tài)方法,例子代碼如下:

private interface DefaulableFactory { // Interfaces now allow static methods static Defaulable create( Supplier< Defaulable > supplier ) { return supplier.get();      }  }

下面的代碼片段整合了默認(rèn)方法和靜態(tài)方法的使用場(chǎng)景:

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() );  }

這段代碼的輸出結(jié)果如下:

Default implementation  Overridden implementation

由于JVM上的默認(rèn)方法的實(shí)現(xiàn)在字節(jié)碼層面提供了支持,因此效率非常高。默認(rèn)方法允許在不打破現(xiàn)有繼承體系的基礎(chǔ)上改進(jìn)接口。該特性在官方庫(kù)中的應(yīng)用是:給java.util.Collection接口添加新方法,如stream()parallelStream()forEach()removeIf()等等。

盡管默認(rèn)方法有這么多好處,但在實(shí)際開(kāi)發(fā)中應(yīng)該謹(jǐn)慎使用:在復(fù)雜的繼承體系中,默認(rèn)方法可能引起歧義和編譯錯(cuò)誤。如果你想了解更多細(xì)節(jié),可以參考。

2.3 方法引用

方法引用使得開(kāi)發(fā)者可以直接引用現(xiàn)存的方法、Java類(lèi)的構(gòu)造方法或者實(shí)例對(duì)象。方法引用和Lambda表達(dá)式配合使用,使得java類(lèi)的構(gòu)造方法看起來(lái)緊湊而簡(jiǎn)潔,沒(méi)有很多復(fù)雜的模板代碼。

西門(mén)的例子中,Car類(lèi)是不同方法引用的例子,可以幫助讀者區(qū)分四種類(lèi)型的方法引用。

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() );      }  }

第一種方法引用的類(lèi)型是構(gòu)造器引用,語(yǔ)法是Class::new,或者更一般的形式:Class<T>::new。注意:這個(gè)構(gòu)造器沒(méi)有參數(shù)。

final Car car = Car.create( Car::new ); final List< Car > cars = Arrays.asList( car );

第二種方法引用的類(lèi)型是靜態(tài)方法引用,語(yǔ)法是Class::static_method。注意:這個(gè)方法接受一個(gè)Car類(lèi)型的參數(shù)。

cars.forEach( Car::collide );

第三種方法引用的類(lèi)型是某個(gè)類(lèi)的成員方法的引用,語(yǔ)法是Class::method,注意,這個(gè)方法沒(méi)有定義入?yún)ⅲ?/p>

cars.forEach( Car::repair );

第四種方法引用的類(lèi)型是某個(gè)實(shí)例對(duì)象的成員方法的引用,語(yǔ)法是instance::method。注意:這個(gè)方法接受一個(gè)Car類(lèi)型的參數(shù):

final Car police = Car.create( Car::new );  cars.forEach( police::follow );

運(yùn)行上述例子,可以在控制臺(tái)看到如下輸出(Car實(shí)例可能不同):

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

如果想了解和學(xué)習(xí)更詳細(xì)的內(nèi)容,可以參考

2.4 重復(fù)注解

自從Java 5中引入以來(lái),這個(gè)特性開(kāi)始變得非常流行,并在各個(gè)框架和項(xiàng)目中被廣泛使用。不過(guò),注解有一個(gè)很大的限制是:在同一個(gè)地方不能多次使用同一個(gè)注解。Java 8打破了這個(gè)限制,引入了重復(fù)注解的概念,允許在同一個(gè)地方多次使用同一個(gè)注解。

在Java 8中使用@Repeatable注解定義重復(fù)注解,實(shí)際上,這并不是語(yǔ)言層面的改進(jìn),而是編譯器做的一個(gè)trick,底層的技術(shù)仍然相同。可以利用下面的代碼說(shuō)明:

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() );          }      }  }

正如我們所見(jiàn),這里的Filter類(lèi)使用@Repeatable(Filters.class)注解修飾,而Filters是存放Filter注解的容器,編譯器盡量對(duì)開(kāi)發(fā)者屏蔽這些細(xì)節(jié)。這樣,Filterable接口可以用兩個(gè)Filter注解注釋?zhuān)ㄟ@里并沒(méi)有提到任何關(guān)于Filters的信息)。

另外,反射API提供了一個(gè)新的方法:getAnnotationsByType(),可以返回某個(gè)類(lèi)型的重復(fù)注解,例如Filterable.class.getAnnoation(Filters.class)將返回兩個(gè)Filter實(shí)例,輸出到控制臺(tái)的內(nèi)容如下所示:

filter1  filter2

如果你希望了解更多內(nèi)容,可以參考。

2.5 更好的類(lèi)型推斷

Java 8編譯器在類(lèi)型推斷方面有很大的提升,在很多場(chǎng)景下編譯器可以推導(dǎo)出某個(gè)參數(shù)的數(shù)據(jù)類(lèi)型,從而使得代碼更為簡(jiǎn)潔。例子代碼如下:

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;      }  }

下列代碼是Value<String>類(lèi)型的應(yīng)用:

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() );      }  }

參數(shù)Value.defaultValue()的類(lèi)型由編譯器推導(dǎo)得出,不需要顯式指明。在Java 7中這段代碼會(huì)有編譯錯(cuò)誤,除非使用Value.<String>defaultValue()。

2.6 拓寬注解的應(yīng)用場(chǎng)景

Java 8拓寬了注解的應(yīng)用場(chǎng)景。現(xiàn)在,注解幾乎可以使用在任何元素上:局部變量、接口類(lèi)型、超類(lèi)和接口實(shí)現(xiàn)類(lèi),甚至可以用在函數(shù)的異常定義上。下面是一些例子:

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_USERElementType.TYPE_PARAMETER是Java 8新增的兩個(gè)注解,用于描述注解的使用場(chǎng)景。Java 語(yǔ)言也做了對(duì)應(yīng)的改變,以識(shí)別這些新增的注解。

3. Java編譯器的新特性

3.1 參數(shù)名稱(chēng)

為了在運(yùn)行時(shí)獲得Java程序中方法的參數(shù)名稱(chēng),老一輩的Java必須使用不同方法,例如。Java 8終于將這個(gè)特性規(guī)范化,在語(yǔ)言層面(使用反射API和Parameter.getName()方法)和字節(jié)碼層面(使用新的javac編譯器以及-parameters參數(shù))提供支持。

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() );          }      }  }

在Java 8中這個(gè)特性是默認(rèn)關(guān)閉的,因此如果不帶-parameters參數(shù)編譯上述代碼并運(yùn)行,則會(huì)輸出如下結(jié)果:

Parameter: arg0

如果帶-parameters參數(shù),則會(huì)輸出如下結(jié)果(正確的結(jié)果):

Parameter: args

如果你使用Maven進(jìn)行項(xiàng)目管理,則可以在maven-compiler-plugin編譯器的配置項(xiàng)中配置-parameters參數(shù):

<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>

4. Java官方庫(kù)的新特性

Java 8增加了很多新的工具類(lèi)(date/time類(lèi)),并擴(kuò)展了現(xiàn)存的工具類(lèi),以支持現(xiàn)代的并發(fā)編程、函數(shù)式編程等。

4.1 Optional

Java應(yīng)用中最常見(jiàn)的bug就是。在Java 8之前,引入了Optionals類(lèi)來(lái)解決NullPointerException,從而避免源碼被各種null檢查污染,以便開(kāi)發(fā)者寫(xiě)出更加整潔的代碼。Java 8也將Optional加入了官方庫(kù)。

Optional僅僅是一個(gè)容易:存放T類(lèi)型的值或者null。它提供了一些有用的接口來(lái)避免顯式的null檢查,可以參考了解更多細(xì)節(jié)。

接下來(lái)看一點(diǎn)使用Optional的例子:可能為空的值或者某個(gè)類(lèi)型的值:

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!" ) );

如果Optional實(shí)例持有一個(gè)非空值,則isPresent()方法返回true,否則返回false;orElseGet()方法,Optional實(shí)例持有null,則可以接受一個(gè)lambda表達(dá)式生成的默認(rèn)值;map()方法可以將現(xiàn)有的Opetional實(shí)例的值轉(zhuǎn)換成新的值;orElse()方法與orElseGet()方法類(lèi)似,但是在持有null的時(shí)候返回傳入的默認(rèn)值。

上述代碼的輸出結(jié)果如下:

Full Name is set? false Full Name: [none] Hey Stranger!

再看下另一個(gè)簡(jiǎn)單的例子:

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();

這個(gè)例子的輸出是:

First Name is set? true First Name: Tom Hey Tom!

如果想了解更多的細(xì)節(jié),請(qǐng)參考。

4.2 Streams

新增的(java.util.stream)將生成環(huán)境的函數(shù)式編程引入了Java庫(kù)中。這是目前為止最大的一次對(duì)Java庫(kù)的完善,以便開(kāi)發(fā)者能夠?qū)懗龈佑行А⒏雍?jiǎn)潔和緊湊的代碼。

Steam API極大得簡(jiǎn)化了集合操作(后面我們會(huì)看到不止是集合),首先看下這個(gè)叫Task的類(lèi):

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 );          }      }  }

Task類(lèi)有一個(gè)分?jǐn)?shù)(或偽復(fù)雜度)的概念,另外還有兩種狀態(tài):OPEN或者CLOSED。現(xiàn)在假設(shè)有一個(gè)task集合:

final Collection< Task > tasks = Arrays.asList( new Task( Status.OPEN, 5 ), new Task( Status.OPEN, 13 ), new Task( Status.CLOSED, 8 )   );

首先看一個(gè)問(wèn)題:在這個(gè)task集合中一共有多少個(gè)OPEN狀態(tài)的點(diǎn)?在Java 8之前,要解決這個(gè)問(wèn)題,則需要使用foreach循環(huán)遍歷task集合;但是在Java 8中可以利用steams解決:包括一系列元素的列表,并且支持順序和并行處理。

// Calculate total points of all active tasks using sum() final long totalPointsOfOpenTasks = tasks      .stream()      .filter( task -> task.getStatus() == Status.OPEN )      .mapToInt( Task::getPoints )      .sum();    System.out.println( "Total points: " + totalPointsOfOpenTasks );

運(yùn)行這個(gè)方法的控制臺(tái)輸出是:

Total points: 18

這里有很多知識(shí)點(diǎn)值得說(shuō)。首先,tasks集合被轉(zhuǎn)換成steam表示;其次,在steam上的filter操作會(huì)過(guò)濾掉所有CLOSED的task;第三,mapToInt操作基于每個(gè)task實(shí)例的Task::getPoints方法將task流轉(zhuǎn)換成Integer集合;最后,通過(guò)sum方法計(jì)算總和,得出最后的結(jié)果。

在學(xué)習(xí)下一個(gè)例子之前,還需要記住一些steams()的知識(shí)點(diǎn)。Steam之上的操作可分為中間操作和晚期操作。

中間操作會(huì)返回一個(gè)新的steam——執(zhí)行一個(gè)中間操作(例如filter)并不會(huì)執(zhí)行實(shí)際的過(guò)濾操作,而是創(chuàng)建一個(gè)新的steam,并將原steam中符合條件的元素放入新創(chuàng)建的steam。

晚期操作(例如forEach或者sum),會(huì)遍歷steam并得出結(jié)果或者附帶結(jié)果;在執(zhí)行晚期操作之后,steam處理線已經(jīng)處理完畢,就不能使用了。在幾乎所有情況下,晚期操作都是立刻對(duì)steam進(jìn)行遍歷。

steam的另一個(gè)價(jià)值是創(chuàng)造性地支持并行處理(parallel processing)。對(duì)于上述的tasks集合,我們可以用下面的代碼計(jì)算所有任務(wù)的點(diǎn)數(shù)之和:

// 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 );

這里我們使用parallel方法并行處理所有的task,并使用reduce方法計(jì)算最終的結(jié)果。控制臺(tái)輸出如下:

Total points(all tasks): 26.0

對(duì)于一個(gè)集合,經(jīng)常需要根據(jù)某些條件對(duì)其中的元素分組。利用steam提供的API可以很快完成這類(lèi)任務(wù),代碼如下:

// Group tasks by their status final Map< Status, List< Task > > map = tasks      .stream()      .collect( Collectors.groupingBy( Task::getStatus ) );  System.out.println( map );

控制臺(tái)的輸出如下:

{CLOSED=[[CLOSED, 8]], OPEN=[[OPEN, 5], [OPEN, 13]]}

最后一個(gè)關(guān)于tasks集合的例子問(wèn)題是:如何計(jì)算集合中每個(gè)任務(wù)的點(diǎn)數(shù)在集合中所占的比重,具體處理的代碼如下:

// Calculate the weight of each tasks (as percent of total points)  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 );

控制臺(tái)輸出結(jié)果如下:

[19%, 50%, 30%]

最后,正如之前所說(shuō),Steam API不僅可以作用于Java集合,傳統(tǒng)的IO操作(從文件或者網(wǎng)絡(luò)一行一行得讀取數(shù)據(jù))可以受益于steam處理,這里有一個(gè)小例子:

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 );  }

Stream的方法onClose&nbsp;返回一個(gè)等價(jià)的有額外句柄的Stream,當(dāng)Stream的close()方法被調(diào)用的時(shí)候這個(gè)句柄會(huì)被執(zhí)行。Stream API、Lambda表達(dá)式還有接口默認(rèn)方法和靜態(tài)方法支持的方法引用,是Java 8對(duì)軟件開(kāi)發(fā)的現(xiàn)代范式的響應(yīng)。

4.3 Date/Time API(JSR 310)

Java 8引入了來(lái)改進(jìn)時(shí)間、日期的處理。時(shí)間和日期的管理一直是最令Java開(kāi)發(fā)者痛苦的問(wèn)題。java.util.Date和后來(lái)的java.util.Calendar一直沒(méi)有解決這個(gè)問(wèn)題(甚至令開(kāi)發(fā)者更加迷茫)。

因?yàn)樯厦孢@些原因,誕生了第三方庫(kù), 可以替代Java的時(shí)間管理API。Java 8中新的時(shí)間和日期管理API深受Joda-Time影響,并吸收了很多Joda-Time的精華。新的java.time包包含了所有關(guān)于日期、時(shí)間、 時(shí)區(qū)、Instant(跟日期類(lèi)似但是精確到納秒)、duration(持續(xù)時(shí)間)和時(shí)鐘操作的類(lèi)。新設(shè)計(jì)的API認(rèn)真考慮了這些類(lèi)的不變性(從 java.util.Calendar吸取的教訓(xùn)),如果某個(gè)實(shí)例需要修改,則返回一個(gè)新的對(duì)象。

我們接下來(lái)看看java.time包中的關(guān)鍵類(lèi)和各自的使用例子。首先,Clock類(lèi)使用時(shí)區(qū)來(lái)返回當(dāng)前的納秒時(shí)間和日期。Clock可以替代System.currentTimeMillis()TimeZone.getDefault()

// Get the system clock as UTC offset  final Clock clock = Clock.systemUTC();  System.out.println( clock.instant() );  System.out.println( clock.millis() );

這個(gè)例子的輸出結(jié)果是:

2014-04-12T15:19:29.282Z 1397315969360

第二,關(guān)注下LocalDateLocalTime類(lèi)。LocalDate僅僅包含ISO-8601日歷系統(tǒng)中的日期部分;LocalTime則僅僅包含該日歷系統(tǒng)中的時(shí)間部分。這兩個(gè)類(lèi)的對(duì)象都可以使用Clock對(duì)象構(gòu)建得到。

// Get the local date and local time final LocalDate date = LocalDate.now();  final LocalDate dateFromClock = LocalDate.now( clock );    System.out.println( date );  System.out.println( dateFromClock ); // Get the local date and local time final LocalTime time = LocalTime.now();  final LocalTime timeFromClock = LocalTime.now( clock );    System.out.println( time );  System.out.println( timeFromClock );

上述例子的輸出結(jié)果如下:

2014-04-12 2014-04-12 11:25:54.568 15:25:54.568

LocalDateTime類(lèi)包含了LocalDate和LocalTime的信息,但是不包含ISO-8601日歷系統(tǒng)中的時(shí)區(qū)信息。這里有一些:

// Get the local date/time final LocalDateTime datetime = LocalDateTime.now(); final LocalDateTime datetimeFromClock = LocalDateTime.now( clock ); System.out.println( datetime ); System.out.println( datetimeFromClock );

上述這個(gè)例子的輸出結(jié)果如下:

2014-04-12T11:37:52.309 2014-04-12T15:37:52.309

如果你需要特定時(shí)區(qū)的data/time信息,則可以使用ZoneDateTime,它保存有ISO-8601日期系統(tǒng)的日期和時(shí)間,而且有時(shí)區(qū)信息。下面是一些使用不同時(shí)區(qū)的例子:

// Get the zoned date/time 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 );

這個(gè)例子的輸出結(jié)果是:

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類(lèi),它持有的時(shí)間精確到秒和納秒。這使得我們可以很容易得計(jì)算兩個(gè)日期之間的不同,例子代碼如下:

// Get duration between two dates 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() );

這個(gè)例子用于計(jì)算2014年4月16日和2015年4月16日之間的天數(shù)和小時(shí)數(shù),輸出結(jié)果如下:

Duration in days: 365 Duration in hours: 8783

對(duì)于Java 8的新日期時(shí)間的總體印象還是比較積極的,一部分是因?yàn)镴oda-Time的積極影響,另一部分是因?yàn)楣俜浇K于聽(tīng)取了開(kāi)發(fā)人員的需求。如果希望了解更多細(xì)節(jié),可以參考。

4.4 Nashorn JavaScript引擎

Java 8提供了新的,使得我們可以在JVM上開(kāi)發(fā)和運(yùn)行JS應(yīng)用。Nashorn JavaScript引擎是javax.script.ScriptEngine的另一個(gè)實(shí)現(xiàn)版本,這類(lèi)Script引擎遵循相同的規(guī)則,允許Java和JavaScript交互使用,例子代碼如下:

ScriptEngineManager manager = new ScriptEngineManager();  ScriptEngine engine = manager.getEngineByName( "JavaScript" );    System.out.println( engine.getClass().getName() );  System.out.println( "Result:" + engine.;

這個(gè)代碼的輸出結(jié)果如下:

jdk.nashorn.api.scripting.NashornScriptEngine Result: 2

4.5 Base64

已經(jīng)被加入到Java 8官方庫(kù)中,這樣不需要使用第三方庫(kù)就可以進(jìn)行Base64編碼,例子代碼如下:

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 );      }  }

這個(gè)例子的輸出結(jié)果如下:

QmFzZTY0IGZpbmFsbHkgaW4gSmF2YSA4IQ==  Base64 finally in Java 8!

新的Base64API也支持URL和MINE的編碼解碼。
(Base64.getUrlEncoder() / Base64.getUrlDecoder()Base64.getMimeEncoder() / Base64.getMimeDecoder())。

4.6 并行數(shù)組

Java8版本新增了很多新的方法,用于支持并行數(shù)組處理。最重要的方法是parallelSort(),可以顯著加快多核機(jī)器上的數(shù)組排序。下面的例子論證了parallexXxx系列的方法:

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()方法生成20000個(gè)隨機(jī)數(shù),然后使用parallelSort()方法進(jìn)行排序。這個(gè)程序會(huì)輸出亂序數(shù)組和排序數(shù)組的前10個(gè)元素。上述例子的代碼輸出的結(jié)果是:

Unsorted: 591217 891976 443951 424479 766825 351964 242997 642839 119108 552378 Sorted: 39 220 263 268 325 607 655 678 723 793

4.7 并發(fā)性

基于新增的lambda表達(dá)式和steam特性,為Java 8中為java.util.concurrent.ConcurrentHashMap類(lèi)添加了新的方法來(lái)支持聚焦操作;另外,也為java.util.concurrentForkJoinPool類(lèi)添加了新的方法來(lái)支持通用線程池操作(更多內(nèi)容可以參考)。

Java 8還添加了新的java.util.concurrent.locks.StampedLock類(lèi),用于支持基于容量的鎖——該鎖有三個(gè)模型用于支持讀寫(xiě)操作(可以把這個(gè)鎖當(dāng)做是java.util.concurrent.locks.ReadWriteLock的替代者)。

java.util.concurrent.atomic包中也新增了不少工具類(lèi),列舉如下:

  • DoubleAccumulator
  • DoubleAdder
  • LongAccumulator
  • LongAdder

5. 新的Java工具

Java 8提供了一些新的命令行工具,這部分會(huì)講解一些對(duì)開(kāi)發(fā)者最有用的工具。

5.1 Nashorn引擎:jjs

jjs是一個(gè)基于標(biāo)準(zhǔn)Nashorn引擎的命令行工具,可以接受js源碼并執(zhí)行。例如,我們寫(xiě)一個(gè)func.js文件,內(nèi)容如下:

function f() { return 1;   }; print( f() + 1 );

可以在命令行中執(zhí)行這個(gè)命令:jjs func.js,控制臺(tái)輸出結(jié)果是:

2

如果需要了解細(xì)節(jié),可以參考。

5.2 類(lèi)依賴(lài)分析器:jdeps

jdeps是一個(gè)相當(dāng)棒的命令行工具,它可以展示包層級(jí)和類(lèi)層級(jí)的Java類(lèi)依賴(lài)關(guān)系,它以.class文件、目錄或者Jar文件為輸入,然后會(huì)把依賴(lài)關(guān)系輸出到控制臺(tái)。

我們可以利用jedps分析下,為了讓結(jié)果少一點(diǎn),僅僅分析一個(gè)JAR文件:org.springframework.core-3.0.5.RELEASE.jar

jdeps org.springframework.core-3.0.5.RELEASE.jar

這個(gè)命令會(huì)輸出很多結(jié)果,我們僅看下其中的一部分:依賴(lài)關(guān)系按照包分組,如果在classpath上找不到依賴(lài),則顯示”not found”.

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

更多的細(xì)節(jié)可以參考。

6. JVM的新特性

使用()代替持久代(PermGen space)。在JVM參數(shù)方面,使用-XX:MetaSpaceSize-XX:MaxMetaspaceSize代替原來(lái)的-XX:PermSize-XX:MaxPermSize

7. 結(jié)論

通過(guò)為開(kāi)發(fā)者提供很多能夠提高生產(chǎn)力的特性,Java 8使得Java平臺(tái)前進(jìn)了一大步。現(xiàn)在還不太適合將Java 8應(yīng)用在生產(chǎn)系統(tǒng)中,但是在之后的幾個(gè)月中Java 8的應(yīng)用率一定會(huì)逐步提高。作為開(kāi)發(fā)者,現(xiàn)在應(yīng)該學(xué)習(xí)一些Java 8的知識(shí),為升級(jí)做好準(zhǔn)備。

關(guān)于Spring:對(duì)于企業(yè)級(jí)開(kāi)發(fā),我們也應(yīng)該關(guān)注Spring社區(qū)對(duì)Java 8的支持,可以參考這篇文章——

8. 參考資料

By

兩大Java IDE神器 MyEclipse vs IntelliJ IDEA 限時(shí)打折促銷(xiāo)中,助力Java開(kāi)發(fā)之路:


標(biāo)簽:Java

本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn


為你推薦

相關(guān)產(chǎn)品
軟件
  • 產(chǎn)品功能:IDE集成開(kāi)發(fā)環(huán)境
  • 源 碼:非開(kāi)源
  • 產(chǎn)品編號(hào):12992
  • 當(dāng)前版本:v2025.2 [銷(xiāo)售以商家最新版為準(zhǔn),如需其他版本,請(qǐng)來(lái)電咨詢(xún)]
  • 開(kāi) 發(fā) 商: JetBrains 正式授權(quán)
  • ">IntelliJ IDEA

    IntelliJ在業(yè)界被公認(rèn)為優(yōu)秀的Java開(kāi)發(fā)平臺(tái)之一,在智能代碼助手、代碼自動(dòng)提示、重構(gòu)、J2EE支持、Ant、JUnit、CVS整合、代碼審查、 創(chuàng)新的GUI設(shè)計(jì)等方面表現(xiàn)突出,并支持基于Android平臺(tái)的程序開(kāi)發(fā)。

    軟件
  • 產(chǎn)品功能:IDE集成開(kāi)發(fā)環(huán)境
  • 源 碼:非開(kāi)源
  • 產(chǎn)品編號(hào):13016
  • 當(dāng)前版本:v2025.1 [銷(xiāo)售以商家最新版為準(zhǔn),如需其他版本,請(qǐng)來(lái)電咨詢(xún)]
  • 開(kāi) 發(fā) 商: Genuitec 正式授權(quán)
  • ">MyEclipse

    功能最全面、性?xún)r(jià)比最高的企業(yè)級(jí)Java IDE之一

    title
    掃碼咨詢(xún)


    添加微信 立即咨詢(xún)

    電話咨詢(xún)

    客服熱線
    023-68661681

    TOP
    国产亚洲老 | 色琪影院 | 欧美一区韩国二区老 | 免费国产在线精品一区二区 | 国产男女免费完整视频网页 | 国产一区国产二 | 两个人看 | 亚洲日韩精品免费视频91蜜桃 | 一级做a | 亚洲午夜成 | 午夜视频在线观看免费 | 国产中文字幕不卡在线观看 | 日日噜噜夜夜狠狠va | 欧洲激情网 | 五月婷婷丁香色 | 日韩高清在线播放不 | 日韩亚洲制服欧美综合 | 99re热视频这里只有精 | 免费观看又黄又硬又爽的视频 | 亚洲欧美综合高清在线 | 亚洲国产一区二区中文字幕 | 日本xxxx | 两性午夜刺激性视频2345 | 亚洲视频欧美视频在线视频 | 国产一区二区精品在线观看 | 偷窥清纯综合图区 | 亚洲一区二区福利在线观看 | 按摩偷拍一区不卡 | 的免费视频 | 国产精品不卡一区二区 | 影视先锋资源免费在线观看 | 91看片婬黄大片 | a大片高清在线观看 | 视频一区二区 | 国产国产乱片在线播放 | 成年男人午夜片免费观看 | 九九热这里只有精品视频 | 中文字幕综 | 日韩在线视频一区二区 | 亚洲国产综合精品中久 | 国产韩国精品一区二 | 色香欲综合成人免费视频 | 国产偷国产偷精 | 欧美日韩国产网站 | 精品人伦一区二区三区蜜桃 | 精品亚洲欧 | 欧美日韩一区二区不卡三区 | 亚洲欧美中文日韩v在线观看 | 一区二区三区在线播放 | 免费韩剧美剧热播排行 | 中文字幕一区二区 | 亚洲人成中文字幕在线观看 | 精品亚洲国产 | 亚洲限制级资源在线观看 | 亚洲精品有码在线观看 | 国产综合在线91精品思思 | 爽死七七| 欧美一级大黄特黄 | 最新日本一道免费一区二区 | 中文字幕国产日韩 | 国产伦精品一区二区三区精品 | 日本欧美一区二区三区片 | 欧美日本到一区二区三区 | 97公开视频 | 热搜电视剧在线观 | 日韩综合一二三区视 | aⅴ在线视频男人的天堂 | 日本动漫在线 | 乱码高清在线观看 | 欧美综合在线观看 | 色偷偷中 | 国产精品一区二区亚瑟不卡 | 亚洲福利一区福利三区 | 挤奶在线| 国产欧美一区二区三区综合野 | 国产乱码精品一区二区三区香蕉 | 亚洲国产日韩在线人成电影 | 亚洲欧洲国产精品香蕉网 | 97碰成人国产免费公开视频 | 日韩欧美一区二区三区综学生 | 国产精品自产精品在线观看 | 全黄裸片一29分钟免费真人版 | 国产一区二区三区乱码 | 中文字幕亚洲欧美 | 91短视频app官网下载 | 一区二区亚洲日本欧美激情久婷婷 | 97国产在线观看 | 国产秘精品入口欧 | 中文字幕在线播放视频 | 国产又黄又大又粗又硬又猛樱花 | 999国内精品永久免费观看 | 婷婷婷国产在线视频 | 亚洲偷自拍另类图片二区 | 国产综合专区一区二区 | 国产精品日韩欧美在线 | 视频播放| 国产在线观看一区精品 | 激性欧美在线播激性欧美 | 在线观看成人年视频免费 | 亚洲和欧洲一码二码区别在 | 99精品国产在 | 国产精品自线在线播放 | 韩国午夜理 | 91精品国产自产老师啪 | 精品综合视频 | 91啪国自产在线高清观看 | 国产熟女绯色一区二区三区免费 | 国产高清一区二区视频 | 国产美女自卫慰水免费视频 | 97精品亚成在人线免视频 | 亚洲视频免费观看 | 国产黃色精品三級一区二区 | 国产电影在线观看 | 男人的天堂 | 91人成在线观看网站 | 亚洲中文在线播放一区 | 七七影院| 给我免费的视频在 | 永久亚洲成a人片777777 | 成人观看的视频三级 | 亚美影院 | 小sb几天没做又欠ch | 国产亚洲精品aa | 网站资源多午夜激情影院 | 国产suv精品一区二区883 | 永远免费观看 | 国产又大又黑又粗免费视频 | 日本+国产+欧美 | 成人黄性视频 | 国产一区二区色婬影院 | 天美麻花 | 中文字幕一区二区三区精品 | 日本一本免费线观看视频 | 国产专区一区 | 99热这里只有精品免费播放 | 国产精品碰碰现在自在拍 | 熟女一区中文字 | 国产精品视频大陆精大陆 | 99热这里只有 | 欧美午夜在线视频 | 337p亚洲 | 免费国产a国产片精品 | 精品免费美剧网排行榜在线看 | 亚洲欧美成va人在线观看 | 国产一级特黄生活片 | 乱无伦码中文视频在线 | 国语国产自产精品 | 亚洲国产精品va在线播放 | 伦理、限制级电影手机在线观看 | 国产一区二区三区在线播放 | 亚洲国产精品青青网 | 精品一区二区三区四区在线播放 | 国内日本精品视频在线观看 | 大香伊人中文字幕伊人 | 国产一区二区精品 | 久一视频在线观看 | 精品不卡一区二区 | 日本高清视频在线观看不卡 | 亚洲欧美自偷自拍另类视 | 亚洲国产香蕉碰碰人人 | 中文韩国午夜理伦三级好看 | 国产日韩精品一区二区在线观看 | 日本一区二区三区四区公司 | 亚洲经典一区二区三区爱妃记歌词 | 大地资源第二页中文高清版 | 成人a视频高清 | 女同国产剧情在线观看 | 国产精品不卡一区二区 | 91国在线啪精品一区 | 爱情岛论坛| 国产在线一区二区三区欧美 | 国产激情综合在线看 | 有码+日韩+在线观看 | 国产成a人亚洲精v品在线观看 | 红杏免费视频网站入口导航 | 视频在线华人精品草 | 日韩精品制服诱惑中文字幕 | 中文日产乱幕九区无线码 | 亚洲欧美日韩激情在线观看 | 日本伊人精品一区二区三区 | 国产精品网站在线观看免费传媒 | 手机电视剧全集观看 | 亚洲精品高清在线观看 | 中文字幕制服丝袜一区二区三区 | 亚洲精品国产品国语原创 | 91大神精品全国 | 亚洲欧美日韩一区中文字幕 | 疯狂动物城在线观看 | 国产2025中文天码字幕 | 免费中文字幕不卡视频 | 日本三级观看 | 亚洲成l人在线观看线路 | 精品国产亚洲三 | 成年美女黄 | 亚洲老妈激情一区二区三区 | 欧美精品视频免费观看 | 日日澡夜| 绝对真实国产乱 | 亚洲日产乱码一二三区别 | 99精品偷拍视频一区二区三区 | 添bbb免费看高清视频 | 欧美亚洲国产清纯综合图区 | 国产老色批视频在线观看应用 | 精品亚洲一区二区三区 | 亚洲日韩国产第一成人 | 亚洲欧美色一区二区三区 | 九三精品私密视频在线观看 | 欧美精品黑人粗 | 国产伦精品一区二区三区免费 | 色两性网欧美 | 亚洲卡一卡二卡三乱草莓 | 国产精品国产自线拍免费不卡 | 欧美视频综合二区 | 亚洲系列国产系列 | 日韩精品一区二区免费在线观看 | 日本欧美欧美一级毛卡片 | 无线资源国产资源好片欧美 | 亚洲欧美另类一区二区 | 91精品国产免费青青碰 | 红杏亚洲 | 国产痴汉系列在线播放 | 免费网站看v片在线爱的影院 | 女男羞羞视频网站免费 | 欧美女视频网站大全在线观看 | 亚洲精品乱 | 99精品视频免费热播在线观看 | 正在播放国产自在线拍 | 老太xxxx下面毛茸茸 | 国产精品成人a在线观看 | 最新亚洲精品国自 | 国产欧美一区二区三区综合野 | 最新国产精品亚洲 | 国产精品萌白酱永久在线观看 | 亚洲精品乱码一区二区 | 国产户外一 | 欧洲精品视频一二三区视频 | 日韩亚洲国产欧美在线看片 | 国产精品欧美视频另类专区 | 国产精品广西柳州 | 国产色精品vr一区二区 | 国产精品视频高清在线播放 | 香蕉在线精品视频在线观看2 | 亚洲国产精品国语在线 | 老师脱了内裤让我爽了一夜 | 99热在线精品国产观看 | 在线观看日本欧美综合色 | 2025免费高清电影大全 | 无吗一区二区三区 | 成人国产精品一区二区免费 | 免费人成视频在线播放视频 | 国产人成中文字幕 | 天堂中文最新版在线中文 | 日韩欧美国产一区二区浪潮 | 五月综合激情国产 | 精产国品一二三产区m553 | 国产精品理论片在线观看 | 一本大道香蕉在线 | 一区二区色综合 | 中文自拍日本国产 | 日本在线综合一区二区三区 | 国产日韩一区二区三免费高清 | 中文字幕无线码中文字幕网站 | 国产欧美一区二区综合 | 里啪啦影院大全 | 字幕在线观看 | 在线观看日韩欧美 | 99热这里只 | 99re热有精品视频国产 | 在线观看亚洲精品福利片 | aⅴ国产在线观看 | 欧美大片在线观看免费视频 | 午夜成人亚洲理伦片在线观看 | 欧美日韩产精品自在自线 | 日韩一区精品视频一区二区 | 日本大片免a费观看视频 | 欧美日韩在线精品一区二区三区 | 在线国产精品看片 | 在线永久观看视频网站免费 | 综合三级在线观 | 精品成人乱色一区二区 | 亚洲欧美中日韩中文字幕 | 亚洲国产精品一区 | 欧美视频在线第一页 | 在线天堂免费中文字幕 | 日本国产一区二区三区在线观看 | 欧美高清另类自拍视频在线看 | 国产二区在线播放 | 天美影视–天美影视传媒有限公司 | 99热这里只有精品动漫国产 | 精品日韩欧美一区二区三区 | 全黄性性激高免费视频 | 最好看的中文字幕高清电影 | 国产网红主播 | 天天咱天咱天干天谢 | 国语精品视频自产自拍 | 极品白丝袜app网站 亚洲综合精品网站在线观看 | 国产综合精品一区 | 亚洲永久网址在 | 成人亚洲 | 91热成人精品国产免费 | 日韩电影免费观看2025 | 国产免费131美女 | 亚洲欧美日韩另类国产第一 | 国产欧美一区二区三区户外 | 性爱国产精品福利在线 | 日韩精品一区二区三区中文字幕 | 亚洲宅男精品一区在线观看 | 日韩一区二区三区免费视 | 久热官网 | 欧美在线成人怡红院 | 亚洲精品中文字幕码专区 | 日韩专区在线观 | 97精品国产自在现线免费 | 精品成免费视频9 | 亚洲国产aⅴ精 | 真实国产熟睡乱子伦视频 | 第一福利社区1024 | 国偷自产视频一区二区久 | 亚洲中文字幕a | 疯狂欧美牲乱大交777 | 99久国产精品午夜性色福利 | 国产aⅴ| 亚洲人成网线在线播放va | 99精品在 | 精产国品一二三产品区别在线 | 日本亚洲黑人在线播放 | 亚洲国产高清在线不卡 | 免费精品99久| 精品欧美日 | 亚洲人成色77777在线观看 | 国产手机精品自拍视频 | 国产午夜福利电影免费在线观看 | 五月天婷婷网亚洲综合在线 | 亚洲网站视频在线观看 | 久操电影网| 秋霞理伦韩国在线电影 | 91尤物国产网红尤物福利 | 国产精品极品美女自在线观看免费 | 国产高清亚洲精品视bt天堂频 | 高清一区二区三区日本久 | 国产激情怍爱视频在线观看 | 真人性生交免费视频 | 校园春色亚洲 | 中文字幕亚洲中文字幕 | 欧美在线精品国自产拍免费 | 日产精品卡二卡三卡四卡乱码视频 | 一本到加勒比东 | 日韩欧美亚洲国产ay | 91国偷自产中文字幕婷婷 | 国产午夜无 | 国产欧美视频综合二区 | 天美传媒果冻传媒国产日本 | 国产精品乱码一区二区三区 | 国产精品自在自线亚洲 | 国产欧美日本不卡 | 理论电影免费观看 | 91国语精品自产拍在线观看 | 精品二区中文字幕播放 | 无人在线视频高清免费观看 | 国产精品一级婬片免费 | 国产99综合精品一区二区 | 国产精品国产 | 陌陌影视在线观看高清完整版 | 中文国产欧美不卡 | aa视频观看网站 | 国产精品亚洲产品一区二区三区 | 日韩专区在线播放 | 911青草亚洲精品 | 香港三日本三级人妇三级99 | 国产人成视频在线免费观看 | 日韩中文字 | 日韩亚洲欧美中文高清在线 | 天堂va蜜桃一区二区三区 | 真实国产乱子伦在线观看 | 亚洲欧洲日韩 | 男女xxⅹ爽免费视频 | 在线国产亚洲91 | 视频一区二区三区在线看 | 亚洲日韩在线中文字幕综合 | 日产无人区一线二 | 午夜视频在线免费 | 银杏视频推广下载入口 | 九九热在线免费观看 | 天天被干免费观看视频 | 91九色成人 | 中文字幕精品亚洲无线码一区应 | 欧美囗交xx×b| 国精品无 | 亚洲日本国 | 色偷偷人人澡人人添老妇人 | 亚洲人成网国产最新在线 | 日韩一级香蕉片在线观看 | 在线观看91精品国产性色 | 国产精品专区第一页在线观看 | 欧洲美熟女乱又伦免费视频 | 亚洲色偷偷综合亚洲 | 九九九精品视频在线播放 | 日欧精品卡2卡3卡4卡5卡 | 国产做爰一区二区 | 国产综合 | 欧美肥妇bwbwbwbxx | 网站在线观看 | 国产日韩在线亚洲字幕中文 | 片免费在线 | 国产精品乱码一区二区三区 | 爱我免费视频观看在线www | 国产高清一区二区三区四区 | 欧美日韩成人一区二区三区 | a4yy在线播| 深夜影院 | 国内精品视频一区二区在线观看 | 国产一区二区三区免费在线观看 | 国产精品18 | 在线观看亚洲人成网站 | 国产熟女一 | 精品免费看国产一区二区 | 91免费国产高清在线 | 国产偷伦视频片免费视频 | 国产国产精品人在线观看 | 国产一区二区三区四区在 | 韩国三级hd中文字幕电影天堂 | 国产一区二区四五区在线视频 | 730099带你另眼看世界 | 神马电影院午夜神福利在线观看 | 国产欧美日韩精品高清二区综合区 | 亚洲精品成人 | 未满十八勿入网站 | 在线精品91国产在线观看 | 国产中老年妇女精品 | 精品不卡一区二区 | 三级在线电影 | 露脸对白不带套在线播放 | 国产欧美一区二区三区精品 | 小姨子在旁边差点被看到 | 国产老肥熟一区二区三区 | 国内20 | 免费国产高清视频 | 中文字幕片 | 91九色蝌蚪在线 | 羞羞视频app官 | 中文字幕资源网在线观看免费 | 九七电影院 | 国产女人喷 | 国产揄拍视频在线观看 | 青青国产精品 | 欧美人与性动交 | 国产精品亲子乱子伦xxxx | 手机午夜福利1000视频 | 真人性生交免费视频 | 日本国产欧美 | 一区二区视频在线观看入口 | 日韩欧美视频一二区 | 欧美一级二级三级在线看 | 国内自拍视频一区二区三区 | 不卡影视 | 欧美日韩aⅴ一区二区三区 日本二区在线中文字幕 | 亚洲变态| 国产福利精品视频 | 亚洲v天堂v影 | 国产永久精品91在 | 国产日本欧美在线一区二区 | 免费aⅴ大片在线观看 | 国产精品妇| 亚洲综合激情另类小说区 | 国产亚洲精品aa在线观看 | 亚洲一区二区经典在线播放 | 日韩一区二区三区免费视频 | 亚洲欧美激情在线 | 欧美交换| 免费91最新地址永久入口 | 二区高清| 97精品视频| 羞羞视频在线观看 | 亚洲一区二区经典在线播放 | 中文精品| 凄辱护士日本电影免费看 | 免费观看亚洲人成网站 | 精品欧美日韩在线视频 | 国内日本精品视频在线观看 | 午夜色大片在线观看 | 日本中文字幕一区二区有码 | 日本欧美一区二区三区不卡 | 日本视频在线观看不卡高清免费 | 国产精品h片在 | 午夜福利精品 | 日本成熟丰满老妇xxxx | 国产精品爽爽va在 | 国产精品高清一区二区三区不卡 | 欧美日韩一道免费中文字幕新视频 | 亚洲一级 | 自拍偷拍欧美图片 | 成人免费观看男女 | 91网站免费观看直播 | 在线观看91精品国产性色 | 欧美在线精品国自产拍免费 | 日本一二区在线观看 | 国产日韩制服丝袜在线第一页 | 日韩精品免费一区二区三区 | 亚洲中文字幕乱码一区 | 99国产婷婷综合在 | 亚洲最新精品每日一更新 | 一区二区三 | 国产欧美日本亚洲精品五区 | 精品精品国产自 | 亚洲高清专区 | 国产日韩欧美在线观看播放 | 国产肥熟女视频一区二 | 视频一二亚洲国产二区 | 第一福利社区1024 | 日本中文字幕在线 | 国产人在线成 | 日产一线| 亚洲老女人精品老妇女 | 欧美丰满老妇熟乱xxxxx视频 | 国产亚洲男人的天堂在线观看 | 一区二区三区免费在线观看视频 | 日本精品一区二区三区四区 | 综合自拍 | 91精品国产aⅴ一区二区 | 天堂v亚洲国产ⅴ第一次 | 九三精品私密视频在线观看 | 日韩欧美一卡二区 | 国产免费一区二区三区在线 | 亚洲国产人成在线观看 | 三级在线观看免费观看电影 | 亚洲精品一级高清在线播放国 | 国产黄大片在线视频 | 亚洲中文字幕在线观看视频 | 国产一区二区三区乱码福利 | 国产色爽女免费视频 | 91国语精品自产拍在线观看一 | 米奇影院日韩免费 | 免费大mm视频在线观看 | 国产综合色产在线视频欧美 | 亚洲一区二区三区国产精华液 | 国产欧洲青草依依 | 日韩一区二区三区美女 | 亚洲精品高清中文字幕完整版 | 国产一区二区在线视频观看 | 国子监来了个女弟子 | 欧美女优在线观看br | 亚洲国产中文字幕无线乱码 | 频道国产在线资源 | 国语自产拍在线观看对白 | 欧美精品偷自拍另类在线观看 | 国产一级a毛一级a看免费 | 最新热门电影电视剧免费在线观看 | 国产宅男宅女在线观看 | 日韩美女视频一区 | 亚洲人精品午夜射精日韩 | 字幕在线观看 | 亚洲欧美日韩国 | 国产专区在线播放 | 国产一区二区三区不卡在线 | 性欧美暴力猛交6 | 中文自拍日本国产 | 中文字幕资源网在线观看免费 | 天堂mv在线免费看 | 伊人网视频在线观看 | 国产伊人| 日本又黄又粗暴的视频 | 天堂8在线天堂资源 | 欧洲一级大黄大 | 日本91 | 姝姝窝人体ww | 欧美高清精品一区二区 | 亚洲熟女乱综合一区 | 欧美日韩国产成 | 国产a∨精品一区 | a级在线观看日韩 | 综合一区二区三区激情在线 | 文中字幕一区二区三区视频播放 | 热门影视大全 | 中文字幕在线不卡精品视频99 | 天美传奇mv免费观看完整版 | 韩国日本免费高清观看网址 | 99热在| 中文在线欧美亚洲制服 | 亚洲2025天天堂在线观看 | 国产在线91 | 一区二区三区蜜桃 | wwwらだ天堂中文在线 | 17p密泬18p | 日本精品不卡在线观看 | 成人黃色一級片 | 国产人妖ts重口系列网站观看 | 精品一区 | 国产精品一区 | 欧美综合自拍亚洲综合图区 | 亚洲午夜国产片在线观看 | 热门海量电影资源在线观看 | 亚洲男人 | 亚洲精品亚洲欧美综合区 | 国产视频三级 | 手机在线看片 | 91大神精品网 | 欧美亚日韩国产aⅴ精品中极品 | 精品国内一区二区三区免费 | 精品自拍9| 亚洲人成a在线网站 | 九九九全国免费视频 | 神马光棍 | 亚洲中文在线播放一区 | 999zyz玖玖资源网免费 | 亚洲性线免费观看 | 午夜视频在线观看国产 | 99re热视频这里只有 | 一本久道综合在线 | 中文字幕亚洲日韩第一页 | 欧美高清中文字幕综合网 | 99re视频热这里只有精品 | 太粗太硬小寡妇受不了 | 国产欧美精品久 | 中文字幕免费伦费影视 | 欧美超高清xxxhd | 秋霞国产午夜伦午夜福利片 | 亚洲aⅴ男人的天堂在线观看 | 99久视频只有精品2025 | 菠萝蜜视频在线观看入 | 尤物视频| 国产精品老女人精品视频 | 99人精品福利在线观看 | 亚洲国产日韩a在线观看 | 国产精品免费视频观看玖玖 | 久艹伊人精品综合在线 | 亚洲偷自拍拍综合网 | 无色码中文字幕亚洲精品 | 五月天丁香婷深爱综合网 | 一区二区性爱视频 | 一区二区三区四区视频 | 最新电视剧免费在线观看 | 最新国产福利在 | 国产日产免费高清欧美一区 | 免费视频播放a | 国产精品一卡二卡三卡 | 午夜性色一区二区三区不卡视频 | 羞羞影院午夜男女爽爽影 | 中文字幕在线观看国产 | 午夜电影网 | 香蕉国产亚洲精品va在线观 | 亚洲无亚洲人成网站77777 | 午夜理伦片免费 | 午夜日韩欧美电影在线 | 国产精品人 | 欧美蜜桃臀在线观看一区 | 8x8×拨牐拨| 精品成人福利在线播放 | 日韩中文| 欧美视频在线第一页 | 日干夜干 | 精品亚洲视频在线观看 | 国产精品自在线拍国产电影 | 男插女下 | 欧美午夜在线 | 99视频精品在线 | 国产a级毛| 国产精华 | 梦乃爱华作品在线观看播放 | 91福利| 精品一线二线三 | 国产免费一区二区三区在线 | 热门事件黑料不打烊吃瓜 | 国产日本欧美三区 | 国产精品视频免费一区二区三区 | 午夜影视在线播 | 国产一区日韩一区二区三区 | 92午夜福利影院一区二区三 | 日本黄页网站大 | 国产欧美日韩不卡一区二区 | 破了亲妺妺的处免费视频国产 | 人成视频在线观看国产 | 六月婷婷国产精品综合 | 精品日韩嗷嗷视频在线观看 | 国产色爽女免费视频 | 手机在线视频 | 国产精品一区二区电影 | 亚洲人成在线观看网站播放 | 欧美日韩免 | 精品国产主播在线亚洲 | 99久在线观| 欧美人成在线播放网站色 | 射射影院 | 一区二区三区视频在线播放 | 在线第一页 | 欧美极品欧美日韩 | 999zyz玖| 国产福利91精品在线观看 | 无人在线视频高清免费观看 | 国产在线精品福利91啪 | 羞羞影院午夜男女爽爽影 | 国产伦理片在线观看 | 色吊丝a | 国产精品久线在线观看 | 亚洲国产品综合 | 免费一区二区三区视频 | 亚洲亚洲人成综合网络 | 欧美一区二区三区男人的天堂 | 日韩专区中文字幕在线 | 亚洲国产婷婷综合在线精品 | 国产精彩视频在线观看91 | 成人影片一区免费观看 | 激情中文小说区图片区 | 欧美日本国产 | 最近高清中文在线字幕在线观看 | 99久热国产精品视 | 黑人在日| 精品国产女主播在线观看 | 一区二区三区国产亚洲网站 | 日韩专区亚洲精品欧美专区 | 国产乱码1卡二卡3卡四卡5 | 亚洲欧美人成在线视频 | 欧洲不卡二卡三卡四卡免费 | 91精品啪国产在线观看 | 国产偷国 | 午夜小视频网 | 网友自拍视频一区二区三区 | 国产精品自在在线午夜 | 最近中文字幕在线观看 | 国产免费福利影院 | 麻花传媒 | 国产在线观看免 | 在线不卡视频 | 国产欧美日韩在线一区二区不卡 | 中文字幕亚洲欧美在线不卡 | 国产成本人片免费v | 免费现黄频在线观看国产 | 美女视频免费观看网站黄 | 999re5这里只有精品w | 亚洲精品综合在线影院 | 免费观看性生交大片 | 国产综合精品一区二区青青 | 欧美中文字幕乱伦视频 | 国产婷婷综合在线精品尤物 | 自在拍在线播放 | 国产一区二区三区欧美亚洲 | 午夜插插插 | 久热国产精品视频一区二区三区 | 99成人国产精品视频 | 国产精品亚洲а∨无 | 欧美欧美日韩综合一区天 | 国产交换一区二区三区 | 一区二区在线视 | 午夜影视在线播放免 | 观看视频| 亚洲欧美中文一区二区三区 | 日本欧美大码 | 国产一区日韩二区欧美三区 | 欧美v亚洲v综合v国产v | 亚洲一区二区三区不卡视频 | 精品亚洲成a人在线 | 国产亚洲老熟女视频 | 国产精品一区视频 | 欧美日韩中文字幕在线看 | 亚洲欧洲日本精品永久在线观看 | 欧洲精品 | 中文字幕v | 清纯唯美亚洲 | 亚洲欧美日本国产专区一区 | 国产亚洲美女嘘嘘国产 | 美女视频黄频a美女大全 | 无人区一码二码 | 中文字幕在线有码高清 | 国产精品一区二区在线精品 | 动漫美女无 | 日本免费不卡高清网站 | 中文天堂www | 亚洲第一国产日韩精品欧美 | 亚欧乱色国产精品免费九库 | 国产高清看片日韩 | 依依成人影院在线观看 | 中文字幕在线亚洲二区 | 韩国日本高清免费电影 | 有码在线中字 | 大陆国语自产精品视频在 | 亚欧洲乱码视频在线专区网站 | 60老熟女多次高 | 99精品欧美| 色综合视频一区二区三区 | 99re国产| 亚洲日韩精品综合一区二区 | 久99视频精品免费观看福利 | 好吊操视频这里只有精品 | 国产理论视频在线观看 | 日韩一区二区三区射精 | 免费播放婬乱男女婬视频国产 | a在线亚洲男人的天堂在线 亚洲欧美精品日韩片 | 欧美第一区 | 旋复花7799电影 | 海角国产乱辈乱精品视频 | 凄辱护士日本电影免费看 | 精品视频一区二区三三区四区 | 国产日韩一区 | 九操中文字幕在线观看 | 国产视频高清在线观看 | 中文字幕一区二区三区乱码 | 涩涩国产精| 永久免费不卡在线 | 国产一级特黄a大片99 | 国产在线精品一区二区 |