<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java 9 - 17 特性解讀:Java 9

          共 5315字,需瀏覽 11分鐘

           ·

          2021-10-08 19:58

          Java 17 是Java 最重要的一個LTS版本之一,但是直接從Java 8 過渡到Java 17跨度太大了,勢必有些困難。所以胖哥抽時間梳理了一下從Java 9到Java 17的一些常用API的變動。今天先來看看Java 9 都有什么東西。

          Java 9

          Java 9 最大的變化就是引入了一個JShell和模塊化,日常并沒有用太多,所以今天不花時間在這些功能上面。

          新的創(chuàng)建集合的方法

          用過谷歌Guava類庫的知道,Guava提供了創(chuàng)建集合的靜態(tài)工廠方法,而且能夠推斷泛型,舉個例子:

          List<Person> list = Lists.newArrayList();
          Map<KeyType, Person> map = Maps.newLinkedHashMap();

          而原生態(tài)需要各種new來定義。Java 9改善了這一現(xiàn)狀,現(xiàn)在你可以:

          // [1, 2, 3, 4]
          List<Integer> integers = List.of(1234);
          // {1,2,3}
          Set<Integer> integerSet = Set.of(123);
          // {"hello":"world","hi":"java"}
          Map<String, String> hello = Map.of("hello""world""hi""java");
          ?

          但是請注意:這些API創(chuàng)建的集合都是不可變的(Immutable),你不能對這些集合進行增刪改。

          Stream擴展

          Stream API 是Java 8中引入的最重要的特性之一。在Java 9中Stream進一步得到了加強。

          ofNullable

          Stream<T> ofNullable(T t)  返回包含單個元素的順序Stream ,如果非空,否則返回空Stream 。這個比較簡單就不舉例了。

          iterate

          Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)

          這個是用來生成有限流的新迭代實現(xiàn)。

          • seed 初始種子值
          • hasNext 用來判斷何時結(jié)束流,這個與seed有關(guān)。如何該函數(shù)不迭代保留seed計算,返回的流可能為空。
          • next函數(shù)用來計算下一個元素值。

          舉個例子:

          Stream.iterate(0, i -> i < 5, i -> i + 1)
            .forEach(System.out::println);

          等同于傳統(tǒng)的:

          for (int i = 0; i < 5; ++i) {
              System.out.println(i);
          }

          takeWhile

          Stream.takeWhile(Predicate)   Stream中元素會被斷言Predicate,一旦元素斷言為false就中斷操作,忽略掉沒有斷言的元素(及時未斷言中的元素有滿足條件的),僅僅把之前滿足元素返回。

          Stream.of(123425)
                  .takeWhile(x -> x < 4)
                  .forEach(System.out::println);

          上面的例子中只會輸出1、2、3。

          dropWhile

          這個API和takeWhile機制類似,也用來篩選Stream中的元素。不過符合斷言的元素會被從Stream中移除。一旦元素斷言為false,就會把斷言為false的元素以及后面的元素統(tǒng)統(tǒng)返回。

          Stream.of(123425)
                  .dropWhile(x -> x < 4)
                  .forEach(System.out::println);

          上面的例子會輸出4、2、5。

          ?

          filter操作可不一樣啊,切記!

          Optional擴展

          Optional增加了三個有用的API。

          • stream()  Optional現(xiàn)在可以轉(zhuǎn)Stream。
          • ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)    如果有值了怎么消費,沒有值了怎么消費。
          • or(Supplier<? extends Optional<? extends T>> supplier) 如果有值就返回有值的Optional,否則就提供能獲取一個有值的Optional的渠道(Supplier)。

          try-with-resources 優(yōu)化

          在Java 7 中引入了try-with-resources功能,保證了每個聲明了的資源在語句結(jié)束的時候都會被關(guān)閉。任何實現(xiàn)了java.lang.AutoCloseable接口的對象,和實現(xiàn)了java.io.Closeable接口的對象,都可以當做資源使用。

          在Java 7中需要這樣寫:

              try (BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
                       BufferedInputStream bufferedInputStream1 = new BufferedInputStream(System.in)) {
                      // do something
                  } catch (IOException e) {
                      e.printStackTrace();
                  }

          而到了Java 9簡化為:

          BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in);
          BufferedInputStream bufferedInputStream1 = new BufferedInputStream(System.in);

          try (bufferedInputStream;
               bufferedInputStream1) {
              // do something
          catch (IOException e) {
              e.printStackTrace();
          }

          接口私有方法

          繼Java 8 引入了接口靜態(tài)方法和接口默認方法后,又引入了接口私有方法:

          public interface Catable {
              /**
               * 接口私有方法
               */

              private void doSomething() {

              }
          }

          引入HttpClient

          定義一個新的 HTTP 客戶端 API 來實現(xiàn) HTTP/2 和 WebSocket,并且可以替換舊的HttpURLConnectionAPI。Java以前原生的確實難用,所以誕生了Apache HttpClientComponents 、OkHttp等好用的客戶端。新的也不怎么好用,不過也算從零到一了。

          HttpRequest httpRequest = HttpRequest.newBuilder(newURI)
                  .header("Content-Type","*/*")
                  .GET()
                  .build();
          HttpClient httpClient = HttpClient.newBuilder()
                  .connectTimeout(Duration.of(10, ChronoUnit.SECONDS))
                  .version(HttpClient.Version.HTTP_2)
                  .build();

          Flow

          Spring WebFlux響應(yīng)式Web框架已經(jīng)4年了,響應(yīng)流規(guī)范(reactive streams)在Java 9 中也初步引入到了JDK中。這個東西目前還有些先進,胖哥還沒找到具體應(yīng)用場景,先挖個坑。

          總結(jié)

          其實Java 9 還有一些底層的優(yōu)化,不過對于普通開發(fā)者來說了解這些就夠用了。上面幾個特性,比較常用的就是靜態(tài)不變集合、try-with-resources優(yōu)化。其它的特性需要你對Java 8非常熟練的情況下才會錦上添花。

          往期推薦

          國慶第一天:先換個頭像,然后分享下國慶學(xué)習(xí)計劃吧!

          Spring Boot 實現(xiàn)掃碼登錄,這種方式太香了?。?/p>

          這是什么神仙公司?居然公布離職員工信息,還給差評?

          “80后的人,真的該退出IT行業(yè)了”,某IT公司領(lǐng)導(dǎo)言論惹爭議!

          突發(fā)!LayUI宣布下線


          技術(shù)交流群

          最近有很多人問,有沒有讀者交流群,想知道怎么加入。加入方式很簡單,有興趣的同學(xué),只需要點擊下方卡片,回復(fù)“加群,即可免費加入我們的高質(zhì)量技術(shù)交流群!

          瀏覽 44
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人无码操屄AV大片 | 熟女六区 | 九一精品视频 | 黄色电影在线视频 | 久久国产色av |