Java8新特性

Java8新特性

Project 01

  • 給出了行為參數(shù)化傳遞代碼的方式
  1. 定義一個標(biāo)準(zhǔn)的謂詞模板
public interface ApplePredicate{
    boolean test (Apple apple);
}
  1. 用ApplePredicate的多個實(shí)現(xiàn)代表不同的選擇標(biāo)準(zhǔn)
public class AppleHeavyWeightPredicate implements ApplePredicate{ 
    public boolean test(Apple apple){
        return apple.getWeight() > 150; 
    }
}
public class AppleGreenColorPredicate implements ApplePredicate{
    public boolean test(Apple apple){
        return "green".equals(apple.getColor());
    }
}
  1. 設(shè)置抽象條件篩選
public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate p){
    List<Apple> result = new ArrayList<>();
    for(Apple apple: inventory){
        if(p.test(apple)){ 
            result.add(apple);
        } 
    }
    return result;
}
  1. 代碼傳遞行為
public class AppleRedAndHeavyPredicate implements ApplePredicate{ 
    public boolean test(Apple apple){
        return "red".equals(apple.getColor()) && apple.getWeight() > 150;
    } 
}
List<Apple> redAndHeavyApples = filterApples(inventory, new AppleRedAndHeavyPredicate());
  1. 使用匿名類
List<Apple> redApples = filterApples(inventory, new ApplePredicate() { 
    public boolean test(Apple apple){
        return "red".equals(apple.getColor());
    });
}
  1. 使用Lambda表達(dá)式
List<Apple> result = filterApples(inventory, (Apple apple) -> "red".equals(apple.getColor()));
  1. 將List抽象化
public interface Predicate<T>{
    boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p){
    List<T> result = new ArrayList<>();
    for(T e: list){
        if(p.test(e)){
            result.add(e);
        }
    } 
    return result;
}

Project 02

  • 匿名類與Lambda表達(dá)式的使用

  • 使用函數(shù)式接口

  1. java.util.function.Predicate<T>接口定義了一個名叫test的抽象方法,它接受泛型 T對象列肢,并返回一個boolean
@FunctionalInterface
public interface Predicate<T>{
    boolean test(T t);
}
public static <T> List<T> filter(List<T> list, Predicate<T> p) {
    List<T> results = new ArrayList<>();
    for(T s: list){
        if(p.test(s)){
            results.add(s);
        } 
    }
    return results;
}
Predicate<String> nonEmptyStringPredicate = (String s) -> !s.isEmpty(); List<String> nonEmpty = filter(listOfStrings, nonEmptyStringPredicate);
  1. java.util.function.Consumer<T>定義了一個名叫accept的抽象方法溉委,它接受泛型T的對象秸妥,沒有返回(void)。你如果需要訪問類型T的對象,并對其執(zhí)行某些操作挥等,就可以使用這個接口。
@FunctionalInterface
public interface Consumer<T>{
    void accept(T t);
}
public static <T> void forEach(List<T> list, Consumer<T> c){
    for(T i: list){ 
        c.accept(i);
    }
}
forEach(Arrays.asList(1,2,3,4,5), (Integer i) -> System.out.println(i));
  1. java.util.function.Function<T, R>接口定義了一個叫作apply的方法堤尾,它接受一個泛型T的對象肝劲,并返回一個泛型R的對象。如果你需要定義一個Lambda,將輸入對象的信息映射到輸出辞槐,就可以使用這個接口掷漱。
@FunctionalInterface
public interface Function<T, R>{
    R apply(T t);
}
public static <T, R> List<R> map(List<T> list, Function<T, R> f) {
    List<R> result = new ArrayList<>();
    for(T s: list){
       result.add(f.apply(s)); 
    }
    return result;
}
List<Integer> l = map(Arrays.asList("lambdas","in","action"), (String s) -> s.length());

Project 03

  • 引入流Stream
List<Apple> heavyApples = inventory.stream().filter((Apple a) -> a.getWeight() > 150).collect(toList());
  • 如何使用Stream
  • 如何用流收集數(shù)據(jù)
  • 并行數(shù)據(jù)處理
List<Apple> heavyApples = inventory.parallelStream().filter((Apple a) -> a.getWeight() > 150) .collect(toList());

Project 04

  • 使用Java8新特性重構(gòu)代碼
  • Optional
  • CompletableFuture

源碼參考

Java8InAction

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榄檬,隨后出現(xiàn)的幾起案子卜范,更是在濱河造成了極大的恐慌,老刑警劉巖鹿榜,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件海雪,死亡現(xiàn)場離奇詭異,居然都是意外死亡犬缨,警方通過查閱死者的電腦和手機(jī)喳魏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怀薛,“玉大人刺彩,你說我怎么就攤上這事≈α担” “怎么了创倔?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長焚碌。 經(jīng)常有香客問我畦攘,道長,這世上最難降的妖魔是什么十电? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任知押,我火速辦了婚禮,結(jié)果婚禮上鹃骂,老公的妹妹穿的比我還像新娘台盯。我一直安慰自己,他們只是感情好畏线,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布静盅。 她就那樣靜靜地躺著,像睡著了一般寝殴。 火紅的嫁衣襯著肌膚如雪蒿叠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天蚣常,我揣著相機(jī)與錄音市咽,去河邊找鬼。 笑死抵蚊,一個胖子當(dāng)著我的面吹牛魂务,可吹牛的內(nèi)容都是我干的曼验。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼粘姜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熔酷?” 一聲冷哼從身側(cè)響起孤紧,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拒秘,沒想到半個月后号显,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躺酒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年押蚤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羹应。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡揽碘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出园匹,到底是詐尸還是另有隱情雳刺,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布裸违,位于F島的核電站掖桦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏供汛。R本人自食惡果不足惜枪汪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怔昨。 院中可真熱鬧雀久,春花似錦、人聲如沸朱监。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赫编。三九已至巡蘸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擂送,已是汗流浹背悦荒。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嘹吨,地道東北人搬味。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碰纬。 傳聞我的和親對象是個殘疾皇子萍聊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容