版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
JDK8新特性Oracle2014年3月發(fā)布了Java8正式版,它是java的一個里程牌版本,帶來了諸多新特性。官網(wǎng)介紹:
一、針對java編程語言(JavaProgrammingLanguage)二、針對集合(Collections)三、CompactProfiles四、安全性五、JavaFX六工具(tools)七、國際化八、部署九、Date-TimePackage
十、ScriptingJDK8新特性Oracle2014年3月發(fā)布了Java8正1
java編程語言
(JavaProgrammingLanguage)
1:lambda表達式:一種新的語言特性,能夠把函數(shù)作為方法的參數(shù)或?qū)⒋a作為數(shù)據(jù)。lambda表達式使你在表示函數(shù)接口(具有單個方法的接口)的實例更加緊湊。2.方法引用是lambda表達式的一個簡化寫法,所引用的方法其實是lambda表達式的方法體實現(xiàn),這樣使代碼更容易閱讀
3.默認方法:Java8引入defaultmethod,或者叫virtualextensionmethod,目的是為了讓接口可以事后添加新方法而無需強迫所有實現(xiàn)該接口的類都提供新方法的實現(xiàn)。也就是說它的主要使用場景可能會涉及代碼演進。4.重復注解:允許在同一聲明或類型(類,屬性,或方法)的使用中多次使用同一個注解5.改善了類型推斷6.方法參數(shù)反射
java編程語言
(JavaProgrammingLa2函數(shù)式接口Java8引入的一個核心概念是函數(shù)式接口(FunctionalInterfaces)。接口定義個唯一一個抽象方法,那么這個接口就成為函數(shù)式接口。同時,引入了一個新的注解:@FunctionalInterface??梢园阉旁谝粋€接口前,表示這個接口是一個函數(shù)式接口。這個注解是非必須的,只要接口只包含一個方法的接口,虛擬機會自動判斷,不過最好在接口上使用注解@FunctionalInterface進行聲明。@FunctionalInterfacepublicinterfaceRunnable{
publicabstractvoidrun();}函數(shù)式接口Java8引入的一個核心概念是函數(shù)式接口(F3Lambda表達式函數(shù)式接口的重要屬性是:我們能夠使用Lambda實例化它們,Lambda表達式實例化函數(shù)接口作為方法參數(shù),或者將代碼作為數(shù)據(jù)對待。在Java8之前:匿名內(nèi)部類,監(jiān)聽器和事件處理器的使用都顯得很冗長,代碼可讀性很差。在Java8:Lambda表達式的應用則使代碼變得更加緊湊,可讀性增強;
Lambda表達式使并行操作大集合變得很方便,可以充分發(fā)揮多核CPU的優(yōu)勢,更易于為多核處理器編寫代碼;Lambda表達式由三個部分組成:第一部分為一個括號內(nèi)用逗號分隔的形式參數(shù),參數(shù)是函數(shù)式接口里面方法的參數(shù);第二部分為一個箭頭符號:->;第三部分為方法體,可以是表達式和代碼塊。語法如下:
1.方法體為表達式,該表達式的值作為返回值返回。
(parameters)->expression
2.方法體為代碼塊,必須用{}來包裹起來,且需要一個return返回值,但若函數(shù)式接口里面方法返回值是void,則無需返回值。
Lambda表達式函數(shù)式接口的重要屬性是:我們能夠使用La4Lambda和匿名內(nèi)部類匿名表示法button.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
System.out.print(“這是內(nèi)部類的表示法!");
}
});Lambada表示法button.addActionListener(
(ActionEvente)->
System.out.print("HellloLambdainactionPerformed")
);
Lambda和匿名內(nèi)部類匿名表示法5Lambda舉例//類型聲明MathOperation<Integer,Integer>addition=(Integera,Integerb)->a+b;//不用類型聲明MathOperation<Integer,Integer>subtraction=(a,b)->a-b;//大括號中的返回語句MathOperation<Long,Long>multiplication=(a,b)->{returna*b;};//沒有大括號及返回語句MathOperation<Float,Float>division=(Floata,Floatb)->a/b;System.out.println("10+5="+tester.operate(10,5,addition));Lambda舉例//類型聲明6方法引用是lambda表達式的一個簡化寫法,所引用的方法其實是lambda表達式的方法體實現(xiàn):List<String>names=Arrays.asList("zhangsan","lisi","wangwu","zhaoliu");Collections.sort(names,String::compareTo);Function<Integer,String>f1=String::valueOf;
Function<String,String>function=String::new;Supplier<String>supplier=String::new;方法引用是lambda表達式的一個簡化寫法,所引用的方法其實7默認方法Java8引入defaultmethod,或者叫virtualextensionmethod,目的是為了讓接口可以添加新方法的實現(xiàn),而無需強迫所有實現(xiàn)該接口的類都提供新方法的實現(xiàn)。比中:publicinterfaceMyInterface{ defaultvoidmyMethod(){
System.out.println("MyInterface");
}}默認方法Java8引入defaultmethod,或者叫8重復注解重復注解:允許在同一聲明或類型(類,屬性,或方法)的使用中多次使用同一個注解@Repeatable(Authorities.class)public@interfaceAuthority{
Stringrole();
}public@interfaceAuthorities{Authority[]value();}publicclassRepeatAnnotationUseNewVersion{@Authority(role="Admin")@Authority(role="Manager")publicvoiddoSomeThing(){}}重復注解重復注解:允許在同一聲明或類型(類,屬性,或方法)的9泛型的推斷改進
jdk1.5:List<Apple>box=newArrayList<Apple>();Jdk1.7:List<Apple>box=newArrayList<>();Jdk1.8:List<String>list=newArrayList<>();list.addAll(newArrayList<>());//由于addAll期望獲得Collection<?extendsString>類型的參數(shù),JDK8可以根據(jù)聲明的類型自動判斷。//lambda表達式的推斷MathOperation<Integer,Integer>subtraction=(a,b)->a-b;泛型的推斷改進jdk1.5:List<Apple>b10Stream介紹提供了新包java.util.stream,這個包提供了StreamAPI功能,支持以函數(shù)風格(functional-style)去處理流中的元素。在CollectionsAPI中已經(jīng)整合了StreamAPI,可以在集合上進行批量操作(bulkoperations),如順序或并行的map-reduce轉(zhuǎn)換。
StreamAPI提供了一種操作大數(shù)據(jù)的接口,讓數(shù)據(jù)操作更容易和更快。它具有過濾、映射以及減少遍歷數(shù)等方法,這些方法分兩種:中間方法和終端方法,“流”抽象天生就該是持續(xù)的,中間方法永遠返回的是Stream,因此如果我們要獲取最終結(jié)果的話,必須使用終點操作才能收集流產(chǎn)生的最終結(jié)果Stream介紹提供了新包java.util.stream,11Sream概念Stream不是集合元素,也不是數(shù)據(jù)結(jié)構(gòu),它相當于一個高級版本的Iterator,不可以重復遍歷里面的數(shù)據(jù),像水一樣,流過了就一去不復返。它和普通的Iterator不同的是,它可以并行遍歷,普通的Iterator只能是串行,在一個線程中執(zhí)行。操作包括:中間操作和最終操作(只能操作一遍)
串行流操作在一個線程中依次完成。并行流在多個線程中完成,主要利用了JDK7的Fork/Join框架來拆分任務和加速處理。相比串行流,并行流可以很大程度提高程序的效率Sream概念Stream不是集合元素,也不是數(shù)據(jù)結(jié)構(gòu),12流的種類流有串行和并行兩種,串行流上的操作是在一個線程中依次完成,而并行流則是在多個線程上同時執(zhí)行。并行與串行的流可以相互切換:通過stream.sequential()返回串行的流,通過stream.parallel()返回并行的流。相比較串行的流,并行的流可以很大程度上提高程序的執(zhí)行效率。下面是分別用串行和并行的方式對集合進行排序。list.stream().sequential()).sorted().count();流的種類流有串行和并行兩種,串行流上的操作是在一個線程中依次13流的操作分類:中間中間操作:Intermediate主要是用來對Stream做出相應轉(zhuǎn)換及限制流,實際上是將源Stream轉(zhuǎn)換為一個新的Stream,以達到需求效果。filter():元素過濾:Stream.of(1,2,3,4,5).filter(item->item>3)sorted():元素排序:Stream.of(1,2,3,1,2,3).distinct()map():元素映射:Stream.of(“a”,“b”,“hello”).map(item->item.toUpperCase());flatMap:元素映射:Stream.of(1,2,3).Map(integer->Stream.of(integer*10))distinct():去重操作concat():拼接:Stream.concat(Stream.of(1,2,3),Stream.of(4,5));Peek:peek方法生成一個包含原Stream的所有元素的新Stream,同時會提供一個消費函數(shù)(Consumer實例),新Stream每個元素被消費的時候都會執(zhí)行給定的消費函數(shù),并且消費函數(shù)優(yōu)先執(zhí)行skip:跳過。skip方法將過濾掉原Stream中的前N個元素,返回剩下的元素所組成的新StreamIterate:其返回的也是一個無限長度的Stream,通過函數(shù)f迭代對給指定的元素種子而產(chǎn)生無限連續(xù)有序Stream,其中包含的元素可以認為是:seed,f(seed),f(f(seed))無限循環(huán)generator方法,返回一個無限長度的Stream,其元素由Supplier接口的提供。流的操作分類:中間中間操作:Intermediate主要是用14流的操作分類:短路短路操作(Short-circuiting):對流中的元素進行判斷、取值等操作。allMatch:判斷Stream中的元素是否全部滿足指定條件。如果全部滿足條件返回true,否則返回false。anyMatch:判斷Stream中的是否有滿足指定條件的元素。如果最少有一個滿足條件返回true,否則返回false。findAny:操作用于獲取含有Stream中的某個元素的Optional,如果Stream為空,則返回一個空的Optional。由于此操作的行動是不確定的,其會自由的選擇Stream中的任何元素findFirst:findFirst操作用于獲取含有Stream中的第一個元素的Optional,如果Stream為空,則返回一個空的Optional。、limit:截取原Stream前指定值N個元素noneMatch:noneMatch方法將判斷Stream中的所有元素是否滿足指定的條件,如果所有元素都不滿足條件,返回true;否則,返回false.流的操作分類:短路短路操作(Short-circuiting15流的操作分類:最終操作最終操作:最終操作只能操作一遍,操作完成后,該流就會關閉了。如再進行操作,便會報錯。forEach():遍歷每個元素。reduce():把Stream元素組合起來。例如,字符串拼接,數(shù)值的sum,min,max,average都是特殊的reduce。collect():返回一個新的集合。min():找到最小值。max():找到最大值。流的操作分類:最終操作最終操作:最終操作只能操作一遍,操作完16中間操作:過濾、排序Filter:過濾,側(cè)重于過濾。forEach:循環(huán)Stream<String>streams=Stream.of("helo","world”,"hi","sprin");streams.filter((a)->a.startsWith("h")).forEach(System.out::print);Sorted:排序:默認按字符排序,也可以自定義排序。
如果數(shù)字類型:默認按從小到大的順序。streams.sorted().forEach(System.out::println);中間操作:過濾、排序Filter:過濾,側(cè)重于過濾。forE17中間操作:去重distinct:過濾,Stream中包含的元素進行去重操作
Stream<String>streams=Stream.of("HELLO","World","world","WorLd","World","heLLo");streams.distinct().forEach(System.out::println);注:區(qū)分大小寫中間操作:去重distinct:過濾,Stream中包含的元18中間操作:映射Map映射:側(cè)重于對元素的轉(zhuǎn)換和操作。封裝好了,三種變形:mapToDouble,mapToInt,mapToLongstreams.map(String::toLowerCase).forEach(System.out::println);streams.map(a->a.concat("_aa")).forEach(System.out::println);flatMap映射:該換轉(zhuǎn)函數(shù)的對象是一個Stream,也不會再創(chuàng)建一個新的Stream,而是將原Stream的元素取代為轉(zhuǎn)換的Stream。flatMapToInt,flatMapToLong和flatMapToDouble。中間操作:映射Map映射:側(cè)重于對元素的轉(zhuǎn)換和操作。封裝好了19短路操作(Short-circuiting)allMatch:判斷Stream中的元素是否全部滿足指定條件。如果全部滿足條件返回true,否則返回false。anyMatch:判斷Stream中的是否有滿足指定條件的元素。如果最少有一個滿足條件返回true,否則返回false。findAny:操作用于獲取含有Stream中的某個元素的Optional,如果Stream為空,則返回一個空的Optional。findFirst:操作用于獲取含有Stream中的第一個元素的Optional,如果Stream為空,則返回一個空的Optional。Limit:方法將截取原Stream,截取后Stream的最大長度不能超過指定值NnoneMatch:方法將判斷Stream中的所有元素是否滿足指定的條件,如果所有元素都不滿足條件,返回true;否則,返回false.短路操作(Short-circuiting)allMatch20短路操作allMatch:Stream.of(1,2,3,4).allMatch(integer->integer>0);findAny:Stream.of(1,2,3,4).findAny();findFirst:Stream.of(1,2,3,4).findFirst();Limit:Stream.of(1,2,3,4,5).limit(2)noneMatch:Stream.of(1,2,3,4,5).noneMatch(integer->integer>10);
和相返短路操作allMatch:Stream.of(1,2,321最終操作count方法將返回Stream中元素的個數(shù)。forEach:遍歷Stream中的所元素,避免了使用for循環(huán),讓代碼更簡潔,邏輯更清晰。max方法根據(jù)指定的Comparator,返回一個Optional,該Optional中的value值就是Stream中最大的元素。原Stream根據(jù)比較器Comparator,進行排序(升序或者是降序),所謂的最大值就是從新進行排序的,Stream.of(1,2,3,4,5).max();Stream.of(1,2,3,4,5).max((o1,o2)->o2-o1);最終操作count方法將返回Stream中元素的個數(shù)。22安全性Java一直缺少BASE64編碼API,以至于通常在項目開發(fā)中會選用第三方的API實現(xiàn)(commons-codec或sun.misc.BASE64Decoder)。Java8實現(xiàn)了BASE64編解碼API,它包含到java.util中。//編碼StringasB64=Base64.getEncoder().encodeToString("HelloJDK8".getBytes("utf-8"));System.out.println(asB64);//輸出為:SGVsbG8gSkRLOA==//解碼byte[]asBytes=Base64.getDecoder().decode("SGVsbG8gSkRLOA==");System.out.println(newString(asBytes,"utf-8"));//輸出為:HelloJDK8安全性Java一直缺少BASE64編碼API,以至于通常在23IO/NIO的改進主要包括:改進了java.nio.charset.Charset的實現(xiàn),使編碼和解碼的效率得以提升,也精簡了jre/lib/charsets.jar包;優(yōu)化了String(byte[],*)構(gòu)造方法和String.getBytes()方法的性能;還增加了一些新的IO/NIO方法,使用這些方法可以從文件或者輸入流中獲取流(java.util.stream.Stream),通過對流的操作,可以簡化文本行處理、目錄遍歷和文件查找。新增的API如下:BufferedReader.line():返回文本行的流Stream<String>
(Path,Charset):返回文本行的流Stream<String>
(Path):遍歷當前目錄下的文件和目錄
(Path,int,):遍歷某一個目錄下的所有文件和指定深度的子目錄
(Path,int,BiPredicate,...):查找相應的文件(newFile(“.”).toPath()).forEach(System.out::println);
操作列出當前目錄下的所有文件和目錄IO/NIO的改進主要包括:改進了java.nio.cha24全球化功能支持新的Unicode6.2.0標準,新增了日歷和本地化的API,改進了日期時間的管理等。
Java8吸收了Joda-Time的精華,以一個新的開始為Java創(chuàng)建優(yōu)秀的API。新的java.time中包含了所有關于時鐘(Clock),本地日期(LocalDate)、本地時間(LocalTime)、本地日期時間(LocalDateTime)、時區(qū)(ZonedDateTime)和持續(xù)時間(Duration)的類。歷史悠久的Date類新增了toInstant()方法,用于把Date轉(zhuǎn)換成新的表示形式。這些新增的本地化時間日期API大大簡化了了日期時間和本地化的管理。全球化功能支持新的Unicode6.2.0標準,新增25時間操作舉例例如,下面是對LocalDate,LocalTime的簡單應用:
//LocalDate
LocalDatelocalDate=LocalDate.now();//獲取本地日期
localDate=LocalDate.ofYearDay(2014,200);//獲得2014年的第200天System.out.println(localDate.toString());//輸出:2014-07-19localDate=LocalDate.of(2014,Month.SEPTEMBER,10);//2014年9月10日System.out.println(localDate.toString());//輸出:2014-09-10
//LocalTime
LocalTimelocalTime=LocalTime.now();//獲取當前時間System.out.println(localTime.toString());//輸出當前時間localTime=LocalTime.of(10,20,50);//獲得10:20:50的時間點System.out.println(localTime.toString());//輸出:10:20:50
//Clock時鐘
Clockclock=Clock.systemDefaultZone();//獲取系統(tǒng)默認時區(qū)(當前瞬時時間)longmillis=lis();//時間操作舉例例如,下面是對LocalDate,LocalT26js引擎Nashorn高性能的輕型JavaSript引擎:集成到JRE使用現(xiàn)有的:javax.scriptapi符合ECMAScript-262
5.1版本規(guī)范。新命令行工具JJS可支持JavascriptNashorn不支持瀏覽器DOM的對象js引擎Nashorn高性能的輕型JavaSript引擎27Nashorn舉例javascript運行在jvm已經(jīng)不是新鮮事了,Rhino早在jdk6的時候已經(jīng)存在,但現(xiàn)在為何要替代Rhino,官方的解釋是Rhino相比其他javascript引擎(比如google的V8)實在太慢了,要改造Rhino還不如重寫。Nashorn比Rhino速度快了許多,作為高性能的javascript運行環(huán)境,Nashorn有很多可能。ScriptEngineengine=newScriptEngineManager().getEngineByName("nashorn");engine.eval(new("script.js"));engine.eval(“print(‘HelloWorld!’);”);Nashorn舉例javascript運行在jvm已經(jīng)不是新28JVM去除了永久代(PermGen)被元空間(Metaspace)代替配置:-XX:MetaspaceSize=8m-XX:MaxMetaspaceSize=80m
代替-XX:PermSize=10m-XX:MaxPermSize=10m原因:移除永久代是為融合HotSpotJVM與JRockitVM而做出的努力,因為JRockit沒有永久代,不需要配置永久代。JVM去除了永久代(PermGen)被元空間(Metasp29經(jīng)常不斷地學習,你就什么都知道。你知道得越多,你就越有力量StudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe寫在最后經(jīng)常不斷地學習,你就什么都知道。你知道得越多,你就越有力量寫30感謝聆聽不足之處請大家批評指導PleaseCriticizeAndGuideTheShortcomings結(jié)束語講師:XXXXXXXX年XX月XX日
感謝聆聽結(jié)束語講師:XXXXXX31JDK8新特性Oracle2014年3月發(fā)布了Java8正式版,它是java的一個里程牌版本,帶來了諸多新特性。官網(wǎng)介紹:
一、針對java編程語言(JavaProgrammingLanguage)二、針對集合(Collections)三、CompactProfiles四、安全性五、JavaFX六工具(tools)七、國際化八、部署九、Date-TimePackage
十、ScriptingJDK8新特性Oracle2014年3月發(fā)布了Java8正32
java編程語言
(JavaProgrammingLanguage)
1:lambda表達式:一種新的語言特性,能夠把函數(shù)作為方法的參數(shù)或?qū)⒋a作為數(shù)據(jù)。lambda表達式使你在表示函數(shù)接口(具有單個方法的接口)的實例更加緊湊。2.方法引用是lambda表達式的一個簡化寫法,所引用的方法其實是lambda表達式的方法體實現(xiàn),這樣使代碼更容易閱讀
3.默認方法:Java8引入defaultmethod,或者叫virtualextensionmethod,目的是為了讓接口可以事后添加新方法而無需強迫所有實現(xiàn)該接口的類都提供新方法的實現(xiàn)。也就是說它的主要使用場景可能會涉及代碼演進。4.重復注解:允許在同一聲明或類型(類,屬性,或方法)的使用中多次使用同一個注解5.改善了類型推斷6.方法參數(shù)反射
java編程語言
(JavaProgrammingLa33函數(shù)式接口Java8引入的一個核心概念是函數(shù)式接口(FunctionalInterfaces)。接口定義個唯一一個抽象方法,那么這個接口就成為函數(shù)式接口。同時,引入了一個新的注解:@FunctionalInterface??梢园阉旁谝粋€接口前,表示這個接口是一個函數(shù)式接口。這個注解是非必須的,只要接口只包含一個方法的接口,虛擬機會自動判斷,不過最好在接口上使用注解@FunctionalInterface進行聲明。@FunctionalInterfacepublicinterfaceRunnable{
publicabstractvoidrun();}函數(shù)式接口Java8引入的一個核心概念是函數(shù)式接口(F34Lambda表達式函數(shù)式接口的重要屬性是:我們能夠使用Lambda實例化它們,Lambda表達式實例化函數(shù)接口作為方法參數(shù),或者將代碼作為數(shù)據(jù)對待。在Java8之前:匿名內(nèi)部類,監(jiān)聽器和事件處理器的使用都顯得很冗長,代碼可讀性很差。在Java8:Lambda表達式的應用則使代碼變得更加緊湊,可讀性增強;
Lambda表達式使并行操作大集合變得很方便,可以充分發(fā)揮多核CPU的優(yōu)勢,更易于為多核處理器編寫代碼;Lambda表達式由三個部分組成:第一部分為一個括號內(nèi)用逗號分隔的形式參數(shù),參數(shù)是函數(shù)式接口里面方法的參數(shù);第二部分為一個箭頭符號:->;第三部分為方法體,可以是表達式和代碼塊。語法如下:
1.方法體為表達式,該表達式的值作為返回值返回。
(parameters)->expression
2.方法體為代碼塊,必須用{}來包裹起來,且需要一個return返回值,但若函數(shù)式接口里面方法返回值是void,則無需返回值。
Lambda表達式函數(shù)式接口的重要屬性是:我們能夠使用La35Lambda和匿名內(nèi)部類匿名表示法button.addActionListener(newActionListener(){
@Override
publicvoidactionPerformed(ActionEvente){
System.out.print(“這是內(nèi)部類的表示法!");
}
});Lambada表示法button.addActionListener(
(ActionEvente)->
System.out.print("HellloLambdainactionPerformed")
);
Lambda和匿名內(nèi)部類匿名表示法36Lambda舉例//類型聲明MathOperation<Integer,Integer>addition=(Integera,Integerb)->a+b;//不用類型聲明MathOperation<Integer,Integer>subtraction=(a,b)->a-b;//大括號中的返回語句MathOperation<Long,Long>multiplication=(a,b)->{returna*b;};//沒有大括號及返回語句MathOperation<Float,Float>division=(Floata,Floatb)->a/b;System.out.println("10+5="+tester.operate(10,5,addition));Lambda舉例//類型聲明37方法引用是lambda表達式的一個簡化寫法,所引用的方法其實是lambda表達式的方法體實現(xiàn):List<String>names=Arrays.asList("zhangsan","lisi","wangwu","zhaoliu");Collections.sort(names,String::compareTo);Function<Integer,String>f1=String::valueOf;
Function<String,String>function=String::new;Supplier<String>supplier=String::new;方法引用是lambda表達式的一個簡化寫法,所引用的方法其實38默認方法Java8引入defaultmethod,或者叫virtualextensionmethod,目的是為了讓接口可以添加新方法的實現(xiàn),而無需強迫所有實現(xiàn)該接口的類都提供新方法的實現(xiàn)。比中:publicinterfaceMyInterface{ defaultvoidmyMethod(){
System.out.println("MyInterface");
}}默認方法Java8引入defaultmethod,或者叫39重復注解重復注解:允許在同一聲明或類型(類,屬性,或方法)的使用中多次使用同一個注解@Repeatable(Authorities.class)public@interfaceAuthority{
Stringrole();
}public@interfaceAuthorities{Authority[]value();}publicclassRepeatAnnotationUseNewVersion{@Authority(role="Admin")@Authority(role="Manager")publicvoiddoSomeThing(){}}重復注解重復注解:允許在同一聲明或類型(類,屬性,或方法)的40泛型的推斷改進
jdk1.5:List<Apple>box=newArrayList<Apple>();Jdk1.7:List<Apple>box=newArrayList<>();Jdk1.8:List<String>list=newArrayList<>();list.addAll(newArrayList<>());//由于addAll期望獲得Collection<?extendsString>類型的參數(shù),JDK8可以根據(jù)聲明的類型自動判斷。//lambda表達式的推斷MathOperation<Integer,Integer>subtraction=(a,b)->a-b;泛型的推斷改進jdk1.5:List<Apple>b41Stream介紹提供了新包java.util.stream,這個包提供了StreamAPI功能,支持以函數(shù)風格(functional-style)去處理流中的元素。在CollectionsAPI中已經(jīng)整合了StreamAPI,可以在集合上進行批量操作(bulkoperations),如順序或并行的map-reduce轉(zhuǎn)換。
StreamAPI提供了一種操作大數(shù)據(jù)的接口,讓數(shù)據(jù)操作更容易和更快。它具有過濾、映射以及減少遍歷數(shù)等方法,這些方法分兩種:中間方法和終端方法,“流”抽象天生就該是持續(xù)的,中間方法永遠返回的是Stream,因此如果我們要獲取最終結(jié)果的話,必須使用終點操作才能收集流產(chǎn)生的最終結(jié)果Stream介紹提供了新包java.util.stream,42Sream概念Stream不是集合元素,也不是數(shù)據(jù)結(jié)構(gòu),它相當于一個高級版本的Iterator,不可以重復遍歷里面的數(shù)據(jù),像水一樣,流過了就一去不復返。它和普通的Iterator不同的是,它可以并行遍歷,普通的Iterator只能是串行,在一個線程中執(zhí)行。操作包括:中間操作和最終操作(只能操作一遍)
串行流操作在一個線程中依次完成。并行流在多個線程中完成,主要利用了JDK7的Fork/Join框架來拆分任務和加速處理。相比串行流,并行流可以很大程度提高程序的效率Sream概念Stream不是集合元素,也不是數(shù)據(jù)結(jié)構(gòu),43流的種類流有串行和并行兩種,串行流上的操作是在一個線程中依次完成,而并行流則是在多個線程上同時執(zhí)行。并行與串行的流可以相互切換:通過stream.sequential()返回串行的流,通過stream.parallel()返回并行的流。相比較串行的流,并行的流可以很大程度上提高程序的執(zhí)行效率。下面是分別用串行和并行的方式對集合進行排序。list.stream().sequential()).sorted().count();流的種類流有串行和并行兩種,串行流上的操作是在一個線程中依次44流的操作分類:中間中間操作:Intermediate主要是用來對Stream做出相應轉(zhuǎn)換及限制流,實際上是將源Stream轉(zhuǎn)換為一個新的Stream,以達到需求效果。filter():元素過濾:Stream.of(1,2,3,4,5).filter(item->item>3)sorted():元素排序:Stream.of(1,2,3,1,2,3).distinct()map():元素映射:Stream.of(“a”,“b”,“hello”).map(item->item.toUpperCase());flatMap:元素映射:Stream.of(1,2,3).Map(integer->Stream.of(integer*10))distinct():去重操作concat():拼接:Stream.concat(Stream.of(1,2,3),Stream.of(4,5));Peek:peek方法生成一個包含原Stream的所有元素的新Stream,同時會提供一個消費函數(shù)(Consumer實例),新Stream每個元素被消費的時候都會執(zhí)行給定的消費函數(shù),并且消費函數(shù)優(yōu)先執(zhí)行skip:跳過。skip方法將過濾掉原Stream中的前N個元素,返回剩下的元素所組成的新StreamIterate:其返回的也是一個無限長度的Stream,通過函數(shù)f迭代對給指定的元素種子而產(chǎn)生無限連續(xù)有序Stream,其中包含的元素可以認為是:seed,f(seed),f(f(seed))無限循環(huán)generator方法,返回一個無限長度的Stream,其元素由Supplier接口的提供。流的操作分類:中間中間操作:Intermediate主要是用45流的操作分類:短路短路操作(Short-circuiting):對流中的元素進行判斷、取值等操作。allMatch:判斷Stream中的元素是否全部滿足指定條件。如果全部滿足條件返回true,否則返回false。anyMatch:判斷Stream中的是否有滿足指定條件的元素。如果最少有一個滿足條件返回true,否則返回false。findAny:操作用于獲取含有Stream中的某個元素的Optional,如果Stream為空,則返回一個空的Optional。由于此操作的行動是不確定的,其會自由的選擇Stream中的任何元素findFirst:findFirst操作用于獲取含有Stream中的第一個元素的Optional,如果Stream為空,則返回一個空的Optional。、limit:截取原Stream前指定值N個元素noneMatch:noneMatch方法將判斷Stream中的所有元素是否滿足指定的條件,如果所有元素都不滿足條件,返回true;否則,返回false.流的操作分類:短路短路操作(Short-circuiting46流的操作分類:最終操作最終操作:最終操作只能操作一遍,操作完成后,該流就會關閉了。如再進行操作,便會報錯。forEach():遍歷每個元素。reduce():把Stream元素組合起來。例如,字符串拼接,數(shù)值的sum,min,max,average都是特殊的reduce。collect():返回一個新的集合。min():找到最小值。max():找到最大值。流的操作分類:最終操作最終操作:最終操作只能操作一遍,操作完47中間操作:過濾、排序Filter:過濾,側(cè)重于過濾。forEach:循環(huán)Stream<String>streams=Stream.of("helo","world”,"hi","sprin");streams.filter((a)->a.startsWith("h")).forEach(System.out::print);Sorted:排序:默認按字符排序,也可以自定義排序。
如果數(shù)字類型:默認按從小到大的順序。streams.sorted().forEach(System.out::println);中間操作:過濾、排序Filter:過濾,側(cè)重于過濾。forE48中間操作:去重distinct:過濾,Stream中包含的元素進行去重操作
Stream<String>streams=Stream.of("HELLO","World","world","WorLd","World","heLLo");streams.distinct().forEach(System.out::println);注:區(qū)分大小寫中間操作:去重distinct:過濾,Stream中包含的元49中間操作:映射Map映射:側(cè)重于對元素的轉(zhuǎn)換和操作。封裝好了,三種變形:mapToDouble,mapToInt,mapToLongstreams.map(String::toLowerCase).forEach(System.out::println);streams.map(a->a.concat("_aa")).forEach(System.out::println);flatMap映射:該換轉(zhuǎn)函數(shù)的對象是一個Stream,也不會再創(chuàng)建一個新的Stream,而是將原Stream的元素取代為轉(zhuǎn)換的Stream。flatMapToInt,flatMapToLong和flatMapToDouble。中間操作:映射Map映射:側(cè)重于對元素的轉(zhuǎn)換和操作。封裝好了50短路操作(Short-circuiting)allMatch:判斷Stream中的元素是否全部滿足指定條件。如果全部滿足條件返回true,否則返回false。anyMatch:判斷Stream中的是否有滿足指定條件的元素。如果最少有一個滿足條件返回true,否則返回false。findAny:操作用于獲取含有Stream中的某個元素的Optional,如果Stream為空,則返回一個空的Optional。findFirst:操作用于獲取含有Stream中的第一個元素的Optional,如果Stream為空,則返回一個空的Optional。Limit:方法將截取原Stream,截取后Stream的最大長度不能超過指定值NnoneMatch:方法將判斷Stream中的所有元素是否滿足指定的條件,如果所有元素都不滿足條件,返回true;否則,返回false.短路操作(Short-circuiting)allMatch51短路操作allMatch:Stream.of(1,2,3,4).allMatch(integer->integer>0);findAny:Stream.of(1,2,3,4).findAny();findFirst:Stream.of(1,2,3,4).findFirst();Limit:Stream.of(1,2,3,4,5).limit(2)noneMatch:Stream.of(1,2,3,4,5).noneMatch(integer->integer>10);
和相返短路操作allMatch:Stream.of(1,2,352最終操作count方法將返回Stream中元素的個數(shù)。forEach:遍歷Stream中的所元素,避免了使用for循環(huán),讓代碼更簡潔,邏輯更清晰。max方法根據(jù)指定的Comparator,返回一個Optional,該Optional中的value值就是Stream中最大的元素。原Stream根據(jù)比較器Comparator,進行排序(升序或者是降序),所謂的最大值就是從新進行排序的,Stream.of(1,2,3,4,5).max();Stream.of(1,2,3,4,5).max((o1,o2)->o2-o1);最終操作count方法將返回Stream中元素的個數(shù)。53安全性Java一直缺少BASE64編碼API,以至于通常在項目開發(fā)中會選用第三方的API實現(xiàn)(commons-codec或sun.misc.BASE64Decoder)。Java8實現(xiàn)了BASE64編解碼API,它包含到java.util中。//編碼StringasB64=Base64.getEncoder().encodeToString("HelloJDK8".getBytes("utf-8"));System.out.println(asB64);//輸出為:SGVsbG8gSkRLOA==//解碼byte[]asBytes=Base64.getDecoder().decode("SGVsbG8gSkRLOA==");System.out.println(newString(asBytes,"utf-8"));//輸出為:HelloJDK8安全性Java一直缺少BASE64編碼API,以至于通常在54IO/NIO的改進主要包括:改進了java.nio.charset.Charset的實現(xiàn),使編碼和解碼的效率得以提升,也精簡了jre/lib/charsets.jar包;優(yōu)化了String(byte[],*)構(gòu)造方法和String.getBytes()方法的性能;還增加了一些新的IO/NIO方法,使用這些方法可以從文件或者輸入流中獲取流(java.util.stream.Stream),通過對流的操作,可以簡化文本行處理、目錄遍歷和文件查找。新增的API如下:BufferedReader.line():返回文本行的流Stream<String>
(Path,Charset):返回文本行的流Stream<String>
(Path):遍歷當前目錄下的文件和目錄
(Path,int,):遍歷某一個目錄下的所有文件和指定深度的子目錄
(Path,int,BiPredicate,...):查找相應的文件(newFile(“.”).toPath()).
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國箱式全自動理瓶機市場調(diào)查研究報告
- 2025年PVC大膠章項目可行性研究報告
- 2025至2030年環(huán)衛(wèi)運輸車輛行駛及裝卸記錄儀項目投資價值分析報告
- 2025至2030年松木包裝箱材料項目投資價值分析報告
- 2025年中國主跟擂平機市場調(diào)查研究報告
- 《家禽的主要傳染病》課件
- 五年級數(shù)學(小數(shù)四則混合運算)計算題專項練習及答案匯編
- 四年級數(shù)學(小數(shù)加減運算)計算題專項練習與答案匯編
- 兒童醫(yī)療股權轉(zhuǎn)讓居間合同
- 石油運輸車隊合同樣本
- 2025年急診科護理工作計劃
- 高中家長會 高二寒假線上家長會課件
- 違規(guī)行為與處罰管理制度
- 個人教師述職報告錦集10篇
- 四川省等八省2025年普通高中學業(yè)水平選擇性考試適應性演練歷史試題(含答案)
- 《內(nèi)部培訓師培訓》課件
- 《雷達原理》課件-3.3.3教學課件:相控陣雷達
- 西方史學史課件3教學
- 2024年中國醫(yī)藥研發(fā)藍皮書
- 紅色中國風蛇年年會邀請函
- 廣東省佛山市 2023-2024學年五年級(上)期末數(shù)學試卷
評論
0/150
提交評論