JDK1.8新特性

1.default關(guān)鍵字

java里,接口是不能有方法的實(shí)現(xiàn)的。1.8通過(guò)default關(guān)鍵字可以實(shí)現(xiàn)

public interface NewChar {
    
    public void test1();
    
    public default void test2(){
        System.out.println("我是新特性1");
    }
}

作用是什么?

定義一個(gè)默認(rèn)方法,這個(gè)接口的實(shí)現(xiàn)類實(shí)現(xiàn)了這個(gè)接口之后,不用管這個(gè)方法的實(shí)現(xiàn),可以直接調(diào)用。

2.lambda表達(dá)式

意味著開(kāi)始使用函數(shù)式編程

函數(shù)式編程:

  • 是一種抽象程度很高的編程范式,純粹的函數(shù)式編程語(yǔ)言編寫(xiě)的函數(shù)沒(méi)有變量。
  • 也就是說(shuō),輸入確定,輸出也就是確定的。

特點(diǎn)

  • 允許把函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù),還允許返回一個(gè)函數(shù)

格式

  • ->符號(hào)
  • 左側(cè) 參數(shù)列表
  • 右側(cè) 所需的功能,即lambda體

先來(lái)看一個(gè)例子

//常規(guī)的 集合排序 需要對(duì)接口方法重寫(xiě)
 public void test1(){
        List<String> list =Arrays.asList("aaa","fsa","ser","eere");
         //對(duì)接口方法重寫(xiě)
        Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);
            }
        });
        for (String string : list) {
            System.out.println(string);
        }
    }
    
//不帶參數(shù)類型的lambda寫(xiě)法

      public void testLamda2(){
        List<String> list =Arrays.asList("aaa","fsa","ser","eere");
    // ->符號(hào)
        Collections.sort(list, (a,b)->b.compareTo(a)
        );
        for (String string : list) {
            System.out.println(string);
        }

3.函數(shù)式接口

僅僅只包含一個(gè)抽象方法的接口,每一個(gè)該類型的lambda表達(dá)式都會(huì)匹配到這個(gè)抽象方法

// 這個(gè)注解定義函數(shù)式接口
@FunctionalInterface
public interface MyLamda {
    //只允許定義一個(gè)抽象方法
    public void test1(String y);

//這里如果繼續(xù)加一個(gè)抽象方法便會(huì)報(bào)錯(cuò)
//    public void test1();
    
//default方法可以任意定義
    default String test2(){
        return "123";
    }
    
    default String test3(){
        return "123";
    }

//static方法也可以定義
    static void test4(){
        System.out.println("234");
    }

}

看一下調(diào)用抽象方法

MyLamda m = y -> System.out.println("ss"+y);

4.方法和構(gòu)造函數(shù)引用

符號(hào) :: ClassName::MethodName 沒(méi)有()

  • 符號(hào)前面 目標(biāo)引用
  • 符號(hào)后面 方法名稱
先定義一個(gè)函數(shù)式接口

@FunctionalInterface
public interface TestConverT<T, F> {
    F convert(T t);
}

測(cè)試
public void test(){
//調(diào)用Integer的valueOf方法
    TestConverT<String, Integer> t = Integer::valueOf;
    Integer i = t.convert("111");
    System.out.println(i);
}

對(duì)于構(gòu)造方法也可以這樣調(diào)用

//實(shí)體類User和它的構(gòu)造方法
public class User {    
    private String name;
    
    private String sex;

    public User(String name, String sex) {
        super();
        this.name = name;
        this.sex = sex;
    }
}
//User工廠
public interface UserFactory {
    User get(String name, String sex);
}
//測(cè)試類   這里編譯器會(huì)根據(jù)uf調(diào)用的參數(shù)來(lái)選擇合適的構(gòu)造函數(shù)
    UserFactory uf = User::new;
    User u = uf.get("ww", "man");

5.局部變量限制

  • Lambda可以沒(méi)有限制的捕獲實(shí)例變量和靜態(tài)變量。
  • 但是局部變量必須聲明為final
    • 使用lambda的線程,可能會(huì)在分配該變量的線程將這個(gè)變量回收之后,去訪問(wèn)的。
    • 因此,在訪問(wèn)局部變量時(shí),實(shí)際上是訪問(wèn)他的副本,而不是原始變量。
    • 如果被final修飾之后,那就沒(méi)什么區(qū)別了(原始和副本)
final int num = 1;
Converter<Integer, String> stringConverter =
        (from) -> String.valueOf(from + num);
stringConverter.convert(2);

6.Date api更新

7.Stream

定義:

  • 不是集合元素,不是數(shù)據(jù)結(jié)構(gòu),不保存數(shù)據(jù)
  • 更新一個(gè)高級(jí)版的Iterator,用戶只需要給出對(duì)其包含的元素執(zhí)行什么操作,stream會(huì)在內(nèi)部進(jìn)行遍歷,做出相應(yīng)的數(shù)據(jù)轉(zhuǎn)換。
  • 可以并行化操作,遍歷時(shí),數(shù)據(jù)會(huì)被分成多個(gè)段,每一個(gè)段都在不同的線程中處理,然后將結(jié)果一起輸出。

類型有兩種:

  • Intermediate
    • 打開(kāi)流,做出某種數(shù)據(jù)映射或過(guò)濾,然后返回一個(gè)新的流。
    • 一個(gè)流后可以跟0個(gè)或者多個(gè)這種流
  • Terminal
    • 會(huì)真正的開(kāi)始流的遍歷,并生成一個(gè)結(jié)果 或副作用(side effect)
    • 所以一個(gè)流只能有一個(gè)terminal操作,執(zhí)行完,流就被用光了。
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
 .mapToInt(w -> w.getWeight())
 .sum();

  • stream() 獲取當(dāng)前widgets的source
  • filter mapTotInt 為Intermediate操作,進(jìn)行數(shù)據(jù)篩選和轉(zhuǎn)換
  • sum為terminal操作,得到一個(gè)求和的結(jié)果

所以流的使用就是實(shí)現(xiàn)一個(gè) filter-map-reduce過(guò)程,產(chǎn)生一個(gè)結(jié)果或者導(dǎo)致一個(gè)副作用(side effect)

構(gòu)造流的方式

// 1. Individual values
Stream stream = Stream.of("a", "b", "c");
// 2. Arrays
String [] strArray = new String[] {"a", "b", "c"};
stream = Stream.of(strArray);
stream = Arrays.stream(strArray);
// 3. Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();

流的操作 參考

  • Intermediate
    • map (mapToInt, flatMap 等)(映射)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered
  • Terminal
    • forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator
  • Short-circuiting
    • anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

8. Annotation注解

Java 8允許我們把同一個(gè)類型的注解使用多次,只需要給該注解標(biāo)注一下@Repeatable即可。

9.Optional

解決空指針的問(wèn)題
提供了一些方法,來(lái)做判斷

//不管param是不是null 都不會(huì)拋出異常
Optional<String> nullOptional = Optional.ofNullable(param);

還有一些其他的方法。

10.新的工具和引擎

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容