Java新玩法,Java8新特性終極解析

2021-02-20 Java高級部落

隨著Java 9發布日期越發越近

許多Java程序猿也紛紛開始沸騰起來

然而...與此同時也出來了許多質疑聲

Java9都要出來了...

請問大兄弟們...

java8

你都搞清楚沒啊??

如果還沒搞清楚的童鞋

可以趕快看過來了...

現在可以在接口中定義靜態方法了。例如,java.util.Comparator接口中現在擁有一個靜態的naturalOrder方法。

public static <T extends Comparable<? super T>> Comparator <T>naturalOrder() {return (Comparator<T>) Cmparators.NaturalOrderComparator.INSTANCE;}

還能夠在接口中提供默認方法。通過該功能,程式設計師能夠在不破壞已有的接口實現代碼的前提下添加新方法。例如,java.lang.Iterable接口現在擁有一個默認的forEach方法。

public default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }

注意,接口不能為Object類中的任何方法提供默認的實現。

函數式接口是只定義了一個抽象方法的接口。Java 8引入了FunctionalInterface註解來表明一個接口打算成為一個函數式接口。例如,java.lang.Runnable就是一個函數式接口。

@FunctionalInterfacepublic interface Runnable { public abstract void run();}

注意,不管FunctionalInterface註解是否存在,Java編譯器都會將所有滿足該定義的接口看作是函數式接口。

函數式接口的重要屬性是:我們能夠使用lambda實例化它們,Lambda表達式讓你能夠將函數作為方法參數,或者將代碼作為數據對待。下面是Lambda的一些例子。輸入在左邊,代碼在右邊。輸入類型能夠被推斷出來,同時是可選的。

(int x, int y) ->{ return x + y; }(x, y) -> x + yx -> x * x() -> xx -> { System.out.println(x); }

下面是實例化Runnable函數式接口的一個例子。

Runnable r = () ->{ System.out.println("Running!"); }



方法引用是簡潔的Lambda表達式,能夠用於已經擁有名稱的方法。下面是一些方法引用的例子,右邊是同樣效果的Lambda表達式。

String::valueOf x ->String.valueOf(x)Object::toString x ->x.toString()x::toString () ->x.toString()ArrayList::new () -> new ArrayList<>()


如果使用Lambda表達式訪問一個在Lambda語句體外定義的非靜態變量或者對象,那麼它會被說成是「捕獲」。例如,下面的Lambda會訪問變量x:

int x = 5;return y -> x + y;

一個Lambda表達式僅能夠訪問final或者有效final封閉塊中的局部變量和參數。

新版本向 java.util.function包中添加了很多新的函數式接口。下面是一些例子:

Function<T, R>——將T作為輸入,返回R作為輸出

Predicate<T>——將T作為輸入,返回一個布爾值作為輸出

Consumer<T>——將T作為輸入,不返回任何內容

Supplier<T>——沒有輸入,返回T

BinaryOperator<T>——將兩個T作為輸入,返回一個T作為輸出

新的 java.util.stream包提供了對值流進行函數式操作的類。從一個集合中獲取流的一種常見方式是:

Stream<T> stream = collection.stream();

下面是一個來自於Javadocs包中的例子。

intsumOfWeights = blocks.stream().filter(b ->b.getColor() == RED).mapToInt(b ->b.getWeight()).sum();

在該例子中我們首先使用了一個塊集合作為流的來源,然後在流上執行了filter-map-reduce操作獲取紅塊重量的和。

流可以是無限的、有狀態的,可以是順序的,也可以是並行的。在使用流的時候,你首先需要從一些來源中獲取一個流,執行一個或者多個中間操作,然後執行一個最終操作。中間操作包括filter、map、flatMap、peel、distinct、sorted、limit和substream。終止操作包括forEach、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst和findAny。 java.util.stream.Collectors是一個非常有用的實用類。該類實現了很多歸約操作,例如將流轉換成集合和聚合元素。


這提升了Java編譯器推斷泛型和在泛型方法調用中減少顯式類型參數的能力。在Java 7中,代碼如下:

foo(Utility.<Type>bar());Utility.<Type>foo().bar();

在Java 8中,改進後的參數和調用鏈推斷讓你能夠按照下面的方式編寫代碼:

foo(Utility.bar());Utility.foo().bar();



新的日期/時間API包含在 java.time包中。所有的類都是不可變且線程安全的。日期和時間類型包括Instant、LocalDate、LocalTime、LocalDateTime和ZonedDateTime。除了日期和時間之外,還有Duration和Period類型。另外,值類型包括Month、DayOfWeek、Year、 Month、YearMonth、MonthDay、OffsetTime和OffsetDateTime。這些新的日期/時間類大部分JDBC都支持。

接口可以擁有默認函數的能力讓Java 8得以向集合API中添加大量的新方法。所有的接口都提供了默認的實現,而更加有效的實現則是被添加到了具體的類中。下面是新方法的列表:

Iterable.forEach(Consumer)

Iterator.forEachRemaining(Consumer)

Collection.removeIf(Predicate)

Collection.spliterator()

Collection.stream()

Collection.parallelStream()

List.sort(Comparator)

List.replaceAll(UnaryOperator)

Map.forEach(BiConsumer)

Map.replaceAll(BiFunction)

Map.putIfAbsent(K, V)

Map.remove(Object, Object)

Map.replace(K, V, V)

Map.replace(K, V)

Map.computeIfAbsent(K, Function)

Map.computeIfPresent(K, BiFunction)

Map.compute(K, BiFunction)

Map.merge(K, V, BiFunction)

Map.getOrDefault(Object, V)


Java 8還向並發API中添加了一些新內容,我們將會在此簡要介紹其中的一部分。ForkJoinPool.commonPool()是處理所有並行流操作的結構。沒有明確提交到某個特定池中的所有ForkJoinTask都將會使用通用池。ConcurrentHashMap已經被完全重寫。StampedLock是一個新的鎖實現,它可以作為ReentrantReadWriteLock的一個備選方案。CompletableFuture是Future接口的一個實現,它為異步任務的執行和連結提供了方法。


在Java 8中有一些新的IO/NIO方法,我們能夠使用它們從文件或者輸入流中獲取java.util.stream.Stream。

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.stream()

這裡面有一個新的UncheckedIOException,它是一個繼承了RuntimetimeException的IOException。還有一個CloseableStream,它是一個能夠並且應該被關閉的流。

通過類型註解,我們能夠在更多的地方使用註解,例如像List<@Nullable String>這樣的泛型參數中。這增強了通過靜態分析工具發現錯誤的能力,它將增強並重定義Java內置的類型系統。

Nashorn是一個集成到JDK中的新的、輕量級、高性能的JavaScript實現。Nashorn是Rhino的繼任者,它提升了性能和內存使用情況。它將會支持javax.script API,但是它並不會支持DOM/CSS,也不會包含瀏覽器插件API。

Java 8還向很多其他的包中添加了大量其他的功能,在本文中我們並沒有提及。下面是一些值得注意的內容。可以使用ThreadLocal.withInitial(Supplier)更加簡潔的聲明本地線程變量。長期未兌現的StringJoiner和String.join(...)現在已經是Java 8的一部分了。比較器提供了一些新的方法能夠用於連結和基於域的比較。默認的字符串池映射大小更大了,大約在25—50K。

當然..

這只是Java8新特性中的一小部分...

Java8還有其它許多新的東西

就怕你不知道...

不過就在今晚  8:30

動腦學院 jeff大神

將在  騰訊課堂


動腦學院 Java免費試聽課程中

帶你一起全面研究

《Java新玩法,Java8新特性終極解析》

點擊文章最底下  閱讀原文

觀看課程

老師介紹

所受課程:


學員反饋


相關焦點

  • JAVA8 新特性詳解
    System.out.println("DefalutTest static 方法");}}public class Main {public static void main(String[] args) {//匿名內部類--java8
  • Java 15 即將到來,新特性速覽!
    在發布前夕,我們不妨先一窺新版 JDK 的新特性:第二個外部內存訪問 API(孵化階段),它將使 Java 程序安全高效地訪問 Java 堆以外的外部存儲器。該 API 應該能夠在各種外部內存(如本機、持久和託管堆)上進行操作。
  • java8的函數式編程解析
    其實在java8就已經有java的函數式編程寫法,只是難度較大,大家都習慣了對象式用法,但在其它語言中都有函數式的用法,如js,scala,函數式其實是抽象到極致的思想。什麼是函數式編程 函數式編程並不是Java新提出的概念,其與指令編程相比,強調函數的計算比指令的計算更重要;與過程化編程相比,其中函數的計算可以隨時調用。
  • Java 9 中的 9 個新特性
    (點擊上方公眾號,可快速關注)轉自:開源中國,www.oschina.net/translate/java-9-new-features
  • 我的世界基巖版還用羨慕java版嗎?這幾個特性你們沒有
    在很久以前,基巖版剛剛起步時,連紅石電路都沒有,許多基巖版玩家都很羨慕java版裡面的功能。可以說那時候基巖版的玩法總是落後於java版,但隨著基巖版的不斷更新,玩法漸漸追趕上了java版,由於它優化好,便攜性高,很受玩家們的喜愛,現在更是有一些java版沒有的玩法或特性,來看一看吧!
  • qq飛車手遊特性疊加什麼含義? 賽車特性疊加玩法與效果解析
    qq飛車手遊特性疊加效果怎樣?兼具車輛屬性,完美跑圖競技。手機樂園夏了夏天小編帶來玩法詳情,符合後續實跑。 賽車特性疊加玩法與效果解析 遊戲中每一輛A車都擁有著自己的專屬特性,最近遊戲中出了一個特性疊加的玩法。
  • 你必須掌握的 21 個 Java 核心技術!
    性能調優調優:Thread Dump, 分析內存結構class 二進位字節碼結構, class loader 體系 , class加載過程 , 實例創建過程方法執行過程Java各個大版本更新提供的新特性
  • 我的世界:java版與基巖版,相差兩歲的哥弟倆,有多少不同特性?
    2009年,notch著手開發Minecraft的java版本。2011年,mojang工作室開發了Minecraft移動版,又稱攜帶版,最後被統稱為基巖版。從開發時間來講,java版與基巖版算是一對相差2歲的兄弟倆。由於版本不同,帶來了很多遊戲特性的差異。
  • Java15正式發布, 14個新特性,刷新你的認知!!
    不過沒關係,多了解一下,多掌握一點新東西,對你來說沒有壞處。新特性JDK 15 新特性一覽表: ID JEP Feature
  • xk-time 1.1.0 發布,Java 時間工具包,增加模糊解析日期功能
    is a datetime converter calculator formatter calendar and cron expression tool set, based on java8 date and time API, thread safe, easy to use.
  • 我的世界:只有JAVA版才有的5個特性,基巖版本只有眼饞的份
    這次阿樂給大家帶來的只有java版本才有的五個新特性。雙持功能基巖版本也有雙持功能。在java版本上副手可以放置任何東西的。但是在基巖版本上面副手是不能放置任何東西的。比如說在基巖版本上鑽石劍就不能放進去?而在java版本上面可以放置任何我的世界中的物品,這就是基巖版和java版本的區別。
  • Java的新未來:JVM、Kotlin和Java將在2020年後走向何方?
    開發人員很喜歡這種新函數模式,它具有更強的靈活性,並且能夠安全、輕鬆地編寫並行代碼。可以在下面的Google趨勢圖中看到這種趨勢:示例包括新的Java記錄,新的文本塊(帶三引號的多行字符串)和新的switch語句,後者或多或少是Kotlin when語句的副本。這些就是筆者所說的「Java的Kotlin化」。通過成為更強大的競爭對手,Kotlin為Java指明了前進的道路。從筆者的角度來看,Kotlin是我所見過的唯一可以超越Java成為行業領導者的語言。
  • 開源之系統:如何在Ubuntu20.04系統上安裝Java並配置環境變量
    而如果沒有安裝Java,終端就會提示,Command 『java』 not found,but can be installed with:這樣的字樣。不僅為我們提示了這臺電腦沒有安裝Java,還貼心地提示了輸入哪些命令可以安裝這個平臺環境,而這幾個命令只是不同的版本而已。第一個是11版。所以我們順理成章往下輸入命令。
  • OpenJdk1.8筆記——java啟動流程
    Jdk中java的入口函數文件為openjdk\jdk\src\share\bin\main.c中的main方法(window上為WinMain),然後調用jdk8u-dev/jdk/src/share/bin/java.c的JLI_Launch方法,啟動一個jvm虛擬機;程序入口
  • 爐石傳說 新版本戰旗初體驗,解析元素玩法思路
    爐石傳說 新版本戰旗初體驗,解析元素玩法思路 2020-09-30 20:55  爐石傳說掌遊寶
  • 魔獸世界9.0理髮店新玩法解析 理髮店全新功能介紹
    魔獸世界9.0理髮店新玩法解析 理髮店全新功能介紹 發布時間:20-10-17 15:34 來源:NGA 作者
  • 我的世界:基巖版對比Java版,多出了這七個特性,堪稱隱藏的彩蛋
    你玩的是java版還是基巖版呢?這兩個版本是我們經常使用的版本,看似一模一樣,其實在細節上也有些一些差別。對比Java版,基巖版多出了這七個特性。今天我們就來聊一聊基巖版當中特有的七個特性,堪稱隱藏的彩蛋,如果你都沒有,那絕不是老mc!特性一:禿羊剪羊毛的事情mc玩家們都經常做,獲取羊毛以後,羊也變成了禿羊。這一點jave版與基巖版相似,而特性恰恰就是禿羊的顏色。在java版本當中,被剪掉的羊身體上的顏色與本身顏色並不相同。
  • 《QQ飛車》終極魔法陣活動怎麼樣 終極魔法陣活動玩法攻略
    導 讀 QQ飛車終極魔法陣雙十二活動已經開始了,這次的活動玩法還是比較簡單的,需要玩家注意這個活動的時間限制,那麼具體的玩法有哪些?小編整理了相關的資料和大家分享下吧!
  • 《新劍俠情緣》歷代盟主 家族秘境玩法解析
    隨著《新劍俠情緣手遊》版本更新,越來越多有趣的玩法登場,家族秘境就是其中之一。作為一個家族集體副本活動,家族秘境非常考驗家族成員的協同性,對家族指揮也是一個考驗。目前活動剛剛開啟,很多少俠都對活動不了解,今天我們就來一起看看家族秘境的具體玩法。
  • 《全民主公2》新模式、新玩法震撼上線,新無雙神將揭開神秘面紗!
    作為集塔防和卡牌為一體的三國題材手遊,《全民主公2》憑藉創新多樣的內容和自由度、策略性全面提升的玩法獲得了超高人氣。創新塔防,豐富玩法考驗玩家頭腦作為一款超人氣塔防遊戲,《全民主公2》提供了多樣化的塔防玩法。