Java8 教程第三章之Stream filter(一)

本套JAVA8教程由于是有英文翻譯過來的,如果有翻譯不對(duì)的地方還請(qǐng)多多包涵。

本節(jié)課先簡單的介紹下Java8有哪些新特性,對(duì)于Java6/7版本做出哪些更改.那廢話不多說,趕緊開始今天的課程吧.

在這篇教程中我將向你展示 filter(), collect(), findAny() 和 orElse() 的用法

Streams 中 filter() 和 collect() 函數(shù)的用法

在 Java 8 以前, 我們會(huì)像下面這樣過濾一個(gè) List:

   public static void main(String[] args) {

        List<String> lines = Arrays.asList("spring", "hibernate", "neo4j");
        List<String> result = getFilterOutput(lines, "neo4j");
        for (String temp : result) {
            System.out.println(temp);  
        }

    }

    private static List<String> getFilterOutput(List<String> lines, String filter) {
        List<String> result = new ArrayList<>();
        for (String line : lines) {
            if (!filter.equals(line)) { 
                result.add(line);
            }
        }
        return result;
    }

以上代碼大致意思就是創(chuàng)建了一個(gè)list容器,里面存放了spring,hibernate,neo4j三個(gè)字符串元素,現(xiàn)在我要過濾出list容器不等于neo4j的元素. 大佬們肯定都能看懂吧,結(jié)果肯定輸入spring,hibernate

那么現(xiàn)在就用Java8 開始替換: 使用collect()將一個(gè)List轉(zhuǎn)化為steam(流),然后使用stream.filter() 來過濾它.

    public static void main(String[] args) {
        List<String> lines = Arrays.asList("spring", "hibernate", "neo4j");
        List<String> result = lines.stream()                // 轉(zhuǎn)化為一個(gè)流
                .filter(line -> !"neo4j".equals(line))     // 排除 'String'
                .collect(Collectors.toList());              // 吧輸出流收集回List中
        result.forEach(System.out::println);                //輸出 : spring, hibernate
    }

是不是很簡單, 小伙伴趕緊動(dòng)手敲一下吧

Streams 中 filter(), findAny() 和 orElse()的用法

下面直接上代碼

  @Data
  @NoArgsConstructor
  @AllArgsConstructor
  public class User {

    private String name;
    private int age;

}

在Java 8以前, 你想通過name獲取一個(gè)Person通常像這樣 :

 public static void main(String[] args) {

        List<User> userList = Arrays.asList(
                new User("mkyong", 30),
                new User("jack", 20),
                new User("lawrence", 40)
        );

        User result = getStudentByName(userList, "jack");
        System.out.println(result);

    }

 private static User getStudentByName(List<User> userList, String name) {
        User result = null;
        for (User temp : userList) {
            if (name.equals(temp.getName())) {
                result = temp;
            }
        }
        return result;
 }

輸入結(jié)果可想而知 User{name='Enoch', age=40}

那么趕緊看下在Java 8中怎么實(shí)現(xiàn)吧, 下面使用 stream.filter()來過濾 List,使用 .findAny().orElse (null) 來返回指定的對(duì)象.直接上代碼

public static void main(String[] args) {

        List<User> userList = Arrays.asList(
                new User("張三", 30),
                new User("李四", 20),
                new User("Enoch", 40)
        );
        User result1 = userList.stream()                        // 轉(zhuǎn)化為流
                .filter(x -> "Enoch".equals(x.getName()))        // 只過濾出"Enoch"
                .findAny()                                      // 如果找到了就返回
                .orElse(null);                                  // 如果找不到就返回null

        System.out.println(result1);

        User result2 = userList.stream()
                .filter(x -> "Enoch".equals(x.getName()))
                .findAny()
                .orElse(null);

        System.out.println(result2);

    }

是不是超級(jí)簡單,小伙子不要飄啊, 那下面看看這段代碼是否能看懂呢

public static void main(String[] args) {

        List<User> userList = Arrays.asList(
                new User("張三", 30),
                new User("李四", 20),
                new User("Enoch", 40)
        );
        User result1 = userList.stream()
                .filter((p) -> "李四".equals(p.getName()) && 20 == p.getAge())
                .findAny()
                .orElse(null);
        System.out.println("result 1 :" + result1);

        //或者這樣寫
        User result2 = userList.stream()
                .filter(p -> "Enoch".equals(p.getName()) && 20 == p.getAge()).findAny()
                .orElse(null);
        System.out.println("result 2 :" + result2);
}

如果上面也看懂了那么恭喜你,好厲害, 那下面繼續(xù)往下看吧

Streams中 filter() 和 map()的用法

 public static void main(String[] args) {
        List<User> userList = Arrays.asList(
                new User("張三", 30),
                new User("李四", 20),
                new User("Enoch", 40)
        );
        String name = userList.stream()
                .filter(x -> "Enoch".equals(x.getName()))
                .map(User::getName)                        //吧流轉(zhuǎn)化為String,這里其實(shí)就是
                                          //把一個(gè)新的事物轉(zhuǎn)為另外一種事物了.類型得到了轉(zhuǎn)換
                .findAny()
                .orElse("");
        System.out.println("name : " + name);
        List<String> collect = userList.stream()
                .map(User::getName)
                .collect(Collectors.toList());
        collect.forEach(System.out::println);
    }

map()函數(shù)解釋: 如果有一個(gè)函數(shù)可以將一種類型的值轉(zhuǎn)換成另外一種類型,map 操作就可以 使用該函數(shù),將一個(gè)流中的值轉(zhuǎn)換成一個(gè)新的流。 map 是 Stream 上最常用的操作之一
小伙伴們沒有看懂map不要緊哦,下一章會(huì)繼續(xù)介紹map哦,come on
是不是很簡單呢. 其實(shí)要想理解map還是稍微有難度的. 如果有什么疑問請(qǐng)歡迎留言哦.

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 轉(zhuǎn)自: Java 8 中的 Streams API 詳解 為什么需要 Stream Stream 作為 Java ...
    普度眾生的面癱青年閱讀 2,978評(píng)論 0 11
  • 目錄結(jié)構(gòu) 介紹 Java語言的新特性2.1 Lambdas表達(dá)式與Functional接口2.2 接口的默認(rèn)與靜態(tài)...
    夜風(fēng)月圓閱讀 576評(píng)論 0 2
  • 由于最近一直在用scala寫spark程序,發(fā)現(xiàn)java8的流新特性跟scala幾乎一個(gè)思維,所以整理出來互相學(xué)習(xí)...
    __元昊__閱讀 793評(píng)論 0 3
  • Streams 原文鏈接: Streams 原文作者: shekhargulati 譯者: leege100 狀態(tài)...
    忽來閱讀 5,611評(píng)論 3 32
  • 我有兩個(gè)女兒,大的10虛歲,小的5虛歲。 小孩的容貌,是不是會(huì)在短短幾年之內(nèi)就不斷的變化?大女兒剛...
    貧道告訴你閱讀 705評(píng)論 0 5

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