国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

JAVA8 新特性詳解

2019-11-06 07:35:34
字體:
來源:轉載
供稿:網友
一:接口上定義的方法可以存在方法體

這里寫圖片描述

二:支持Lambda 表達式首先看看在老版本的java中是如何排列字符串的:只需要給靜態方法 Collections.sort 傳入一個List對象以及一個比較器來按指定順序排列。通常做法都是創建一個匿名的比較器對象然后將其傳遞給sort方法。在Java 8 中你就沒必要使用這種傳統的匿名對象的方式了,Java 8提供了更簡潔的語法,lambda表達式:

這里寫圖片描述 這里寫圖片描述

對于函數體只有一行代碼的,你可以去掉大括號{}以及return關鍵字,但是你還可以寫得更短點:

這里寫圖片描述

Lambda的一些解釋:函數式接口Java 8 引入的一個核心概念是函數式接口。如果一個接口定義個唯一一個抽象方法,那么這個接口就成為函數式接口。比如,java.lang.Runnable就是一個函數式接口,因為它只頂一個一個抽象方法:1public abstract void run();留意到“abstract”修飾詞在這里是隱含的,因為這個方法缺少方法體。為了表示一個函數式接口,并非想這段代碼一樣一定需要“abstract”關鍵字。默認方法不是abstract的,所以一個函數式接口里可以定義任意多的默認方法,這取決于你。同時,引入了一個新的Annotation:@FunctionalInterface??梢园阉旁谝粋€接口前,表示這個接口是一個函數式接口。加上它的接口不會被編譯,除非你設法把它變成一個函數式接口。它有點像@Override,都是聲明了一種使用意圖,避免你把它用錯。Lambdas一個函數式接口非常有價值的屬性就是他們能夠用lambdas來實例化。這里有一些lambdas的例子:左邊是指定類型的逗號分割的輸入列表,右邊是帶有return的代碼塊:1(int x, int y) -> { return x + y; }左邊是推導類型的逗號分割的輸入列表,右邊是返回值:1(x, y) -> x + y左邊是推導類型的單一參數,右邊是一個返回值:1x -> x * x左邊沒有輸入 (官方名稱: "burger arrow"),在右邊返回一個值:1() -> x左邊是推導類型的單一參數,右邊是沒返回值的代碼塊(返回void):1x -> { System.out.PRintln(x); }靜態方法引用:1String::valueOf非靜態方法引用:1Object::toString繼承的函數引用:1x::toString構造函數引用:1ArrayList::new你可以想出一些函數引用格式作為其他lambda格式的簡寫。方法引用 等價的lambda表達式String::valueOfx -> String.valueOf(x)Object::toStringx -> x.toString()x::toString() -> x.toString()ArrayList::new() -> new ArrayList<>()當然,在Java里方法能被重載。類可以有多個同名但不同參數的方法。這同樣對構造方法有效。ArrayList::new能夠指向它的3個構造方法中任何一個。決定使用哪個方法是根據在使用的函數式接口。其他:增加并發API· ForkJoinPool.commonPool()· ConcurrentHashMap(v8)· 下面的形式有并行,順序,對象,整型,長整型和double型。有太多的鏈接可以點擊,因此參看ConcurrentHashMap javadocs文檔以獲得更多信息?!?ConcurrentHashMap.reduce...· ConcurrentHashMap.search...· ConcurrentHashMap.forEach...· ConcurrentHashMap.newKeySet()· ConcurrentHashMap.newKeySet(int)· CompletableFuture· StampedLock· LongAdder· LongAccumulator· DoubleAdder· DoubleAccumulator· CountedCompleter· Executors.newWorkStealingPool()· Executors.newWorkStealingPool(int)· 下面的形式有AtomicReference, AtomicInteger, AtomicLong, 和每一個原子數組的版本。 · AtomicReference.getAndUpdate(UnaryOperator)· AtomicReference.updateAndGet(UnaryOperator)· AtomicReference.getAndAccumulate(V, UnaryOperator)· AtomicReference.accumulateAndGet(V, UnaryOperator)ForkJoinPool.commonPool()是處理所有并行流操作的結構。當你 需要的時候,它是一個好而簡單的方式去獲得一個ForkJoinPool/ExecutorService/Executor對象。ConcurrentHashMap<K, V>完全重寫。內部看起來它一點不像是Java7版本。從外部來看幾乎相同,除了它有大量批量操作方法:多種形式的減少搜索和forEach。ConcurrentHashMap.newKeySet()提供了一個并發的java.util.Set實現。它基本上是Collections.newSetFromMap(new ConcurrentHashMap<T, Boolean>())的另一種方式的重寫。StampedLock是一種新型鎖的實現,很可能在大多數場景都可以替代ReentrantReadWriteLock。當作為一個簡單的讀寫鎖的時候,它比RRWL的性能要好。它也為“讀優化”提供了API,通過它你獲得了一個功能有點弱,但代價很小的讀操作鎖的版本,執行讀操作,然后檢查鎖是否被一個寫操作設定為無效。在Heinz Kabutz匯總的一系列幻燈片中,有更多關于這個類及其性能的細節(在這個系列幻燈片大約一半的地方開始的):"移相器和StampedLock演示"CompletableFuture<T>是Future接口的一個非常棒的實現,它提供了無數執行(和串接)異步任務的方法。它特別依賴功能性的接口;lambdas是值得增加這個類的一個重要原因。如果你正在使用Guava的 Future工具,例如Futures,ListenableFuture, 和 SettableFuture,那么你可能會希望校驗CompletableFuture能否作為潛在的替代選擇。IO/NIO API的新增內容· BufferedReader.lines()· Files.list(Path)· Files.walk(Path, int, FileVisitOption...)· Files.walk(Path, FileVisitOption...)· Files.find(Path, int, Bipredicate, FileVisitOption...)· Files.lines(Path, Charset)· DirectoryStream.entries()簡單的說,這些API用于從文件和InputStreams獲取java.util.stream.Stream對象。不過它們與直接從常規的collection得到的流有些不同,它們引入了兩個概念:· UncheckedIOException - 當有IO錯誤時拋出這個異常,不過由于Iterator/Stream的簽名中不允許有IOException,所以它只能借助于unchecked異常?!?CloseableStream - 可以(并且應該)定義在 try-with-resources 語句里面的流。反射和annotation的改動· 類型annotation (JSR 308)· AnnotatedType· Repeatable· Method.getAnnotatedReturnType()· Field.getAnnotationsByType(Class)· Field.getAnnotatedType()· Constructor.getAnnotatedReturnType()· Parameter - 支持 parameter.getName(),等等。Annotation允許在更多的地方被使用,例如List<@Nullable String>。受此影響最大的可能是那些靜態分析工具,如Sonar和FindBugs。JSR 308的網站解釋了增加這些改動的動機,介紹的不錯: "類型Annotation (JSR 308) 和 Checker框架"Nashorn Javascript 引擎提案的摘要: JEP 174: Nashorn JavaScript 引擎我對Nashorn沒什么經驗,因而我對上面提案所描述的所知甚少。簡單的說,它是 Rhino 的接替者。Rhino 顯得有些老了,并且有點慢,開發者決定最好還是從頭做一個。其他新增,涉及java.lang,java.util,和java.sql· ThreadLocal.withInitial(Supplier)· String.join(CharSequence, Charsequence...)· String.join(CharSequence, Iterable)· 下面的方法適用于所有數字的原語類型,并且作為這些類型的包裝(wrapper)類的三個方法。hashCode方法除外,它們的作用是作為BinaryOperatorin的reduce操作的參數。關于這些方法還有很多的鏈接,更多的內容,參考Integer, Long, Double, Float, Byte, Short, 和 Character 的javadoc。· Primitive.min(primitive, primitive);· Primitive.max(primitive, primitive);· Primitive.sum(primitive, primitive);· Primitive.hashCode(primitive)· 同樣,下面新增的 Boolean 的方法可用于BinaryOperator<Boolean>:· Boolean.logicalAnd(boolean, boolean)· Boolean.logicalOr(boolean, boolean)· Boolean.logicalXor(boolean, boolean)· Optional· OptionalInt· OptionalLong· OptionalDouble· Base64· StringJoiner· Spliterator· Spliterators· Comparator.reverSEOrder()· Comparator.thenComparing(Comparator)· Comparator.thenComparing(Function, Comparator)· Comparator.thenComparing(Function)· Comparator.thenComparing(ToIntFunction)· Comparator.thenComparing(ToLongFunction)· Comparator.thenComparing(ToDoubleFunction)· Comparators· 下面的方法適用于數組,支持T[], int[], long[], double[]。關于這些方法有很多鏈接,更多信息參考 Arrays 的javadoc?!?Arrays.spliterator(array)· Arrays.spliterator(array, int, int)· Arrays.stream(array)· Arrays.stream(array, int, int);· Arrays.parallelStream(array)· Arrays.parallelStream(array, int, int);· Arrays.setAll(array, IntFunction)· Arrays.parallelSetAll(array, IntFunction)· Math.toIntExact(long)· Math.addExact(int, int)· Math.subtractExact(int, int)· Math.multiplyExact(int, int)· Math.floorDiv(int, int)· Math.floorMod(int, int)· Math.addExact(long, long)· Math.subtractExact(long, long)· Math.multiplyExact(long, long)· Math.floorDiv(long, long)· Math.floorMod(long, long)· Integer.toUnsignedLong(int)· Integer.toUnsignedString(int)· Integer.toUnsignedString(int, int)· Integer.parseUnsignedInt(String)· Integer.parseUnsignedInt(String, int)· Integer.compareUnsigned(int, int)· Long.toUnsignedString(long, int)· Long.toUnsignedString(long)· Long.parseUnsignedLong(String, int)· Long.parseUnsignedLong(String)· Long.compareUnsigned(long, long)· Long.divideUnsigned(long, long)· Long.remainderUnsigned(long, long)· BigInteger.longValueExact()· BigInteger.intValueExact()· BigInteger.shortValueExact()· BigInteger.byteValueExact()· Objects.isNull(Object) - 可用作謂詞,例如stream.anyMatch(Objects::isNull)· Objects.nonNull(Object) - 可用作謂詞,stream.filter(Objects::nonNull)· Random.ints()· Random.longs()· Random.doubles()· Random.gaussians()· BitSet.stream()· IntSummaryStatistics· LongSummaryStatistics· DoubleSummaryStatistics· Logger的雜項新增· Locale的雜項新增· ResultSet的雜項新增這里可以介紹的太多了,只能挑一些最需要注意的項目。ThreadLocal.withInitial(Supplier<T>) 可以在定義thread-local變量時更好的進行初始化。之前你初始化變量時是這樣的:1ThreadLocal<List<String>> strings = new ThreadLocal<List<String>>() { @Override protectedList<String> initialValue() { return new ArrayList<>();2 }3 };現在則是這樣: 1ThreadLocal<List<String>> strings =2 ThreadLocal.withInital(ArrayList::new);stream的API的返回值有一個可選的<T>,就像min/max, findFirst/Any, 以及reduce的某些形式。這樣做是因為stream中可能沒有任何元素,但是它要提供一個一致的API,既可以處理“一些結果”,也可以處理“沒有結果”。你可以提供默認值,拋異常,或者只在有結果的時候執行一些動作。它與Guava's Optional類非常非常的相似。它一點都不像是在Scala里的操作,也不會試圖成為之一,有相似的地方純屬巧合。 旁白:Java 8's Optional和Guava's Optional最終如此的相似是很有趣的事,盡管荒謬的辯論發生在這兩個庫。"FYI.... Optional was the cause of possibly the single greatest conflagration on the internal Java libraries discussion lists ever."Kevin Bourrillion在 response to "Some new Guava classes targeted for release 10"如實寫到:"On a purely practical note, the discussions surrounding Optional have exceeded its design budget by several orders of magnitude."Brian Goetz 在 response to "Optional require(s) NonNull"寫到。StringJoinerandString.join(...)來得太晚了。他們來得如此之晚以至于大多數Java開發者已經為字符串聯合編寫或發現了有用的工具,但這對JDK本身來說很每秒,因為最終自己實現這一點。每個人都會遇到要求字符串連接的情形,我們現在能夠通過每個Java開發者(事實上的)即將知道的標準的API來闡明,這也算是一件好事。ComparatorsandComparator.thenComparing(...)提供了非常優秀的工具,基于鏈的比較和基于域的比較。像這樣:1people.sort(Comparators.comparing(Person::getLastName)2 .thenComparing(Person::getFirstName));這些新增功能提供了良好的,復雜的各種可讀的簡寫。大多數用例由JDK里增加的 ComparisonChain和Ordering工具類來提供服務。對于什么是有價值的,我認為JDK版本比在Guava-ese里功能等效的版本的可讀性好了很多。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 秭归县| 文昌市| 福清市| 灌南县| 天长市| 漠河县| 阿拉善右旗| 绍兴市| 德惠市| 博罗县| 梧州市| 曲松县| 长武县| 钦州市| 阿克| 青河县| 新营市| 泰安市| 金堂县| 太保市| 襄垣县| 岳池县| 民和| 琼中| 邢台县| 宁海县| 正安县| 揭西县| 隆昌县| 山东省| 浏阳市| 宁都县| 中阳县| 米林县| 永康市| 石狮市| 如东县| 长子县| 阿勒泰市| 新民市| 秦皇岛市|