最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java基礎(chǔ)理論Stream的Filter與謂詞邏輯

 更新時間:2022年03月16日 10:37:09   作者:字母哥哥  
這篇文章主要為大家介紹了java基礎(chǔ)理論Stream的Filter與謂詞邏輯,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

file

一、基礎(chǔ)代碼準備

建立一個實體類,該實體類有五個屬性。下面的代碼使用了lombok的注解Data、AllArgsConstructor,這樣我們就不用寫get、set方法和全參構(gòu)造函數(shù)了。lombok會幫助我們在編譯期生成這些模式化的代碼。

@Data
@AllArgsConstructor
public class Employee {
   private Integer id;
   private Integer age;   //年齡
   private String gender;  //性別
   private String firstName;  
   private String lastName;
}

寫一個測試類,這個測試類的內(nèi)容也很簡單,新建十個Employee 對象

public class StreamFilterPredicate {
    public static void main(String[] args){
        Employee e1 = new Employee(1,23,"M","Rick","Beethovan");
        Employee e2 = new Employee(2,13,"F","Martina","Hengis");
        Employee e3 = new Employee(3,43,"M","Ricky","Martin");
        Employee e4 = new Employee(4,26,"M","Jon","Lowman");
        Employee e5 = new Employee(5,19,"F","Cristine","Maria");
        Employee e6 = new Employee(6,15,"M","David","Feezor");
        Employee e7 = new Employee(7,68,"F","Melissa","Roy");
        Employee e8 = new Employee(8,79,"M","Alex","Gussin");
        Employee e9 = new Employee(9,15,"F","Neetu","Singh");
        Employee e10 = new Employee(10,45,"M","Naveen","Jain");
        List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10);
        List<Employee> filtered = employees.stream()
                .filter(e -> e.getAge() > 70 && e.getGender().equals("M"))
                .collect(Collectors.toList());
        System.out.println(filtered);

    }

}

需要注意的是上面的filter傳入了lambda表達式(之前的章節(jié)我們已經(jīng)講過了),表達過濾年齡大于70并且男性的Employee員工。輸出如下:

[Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)]

二、什么是謂詞邏輯?

下面要說我們的重點了,通過之前的章節(jié)的講解,我們已經(jīng)知道lambda表達式表達的是一個匿名接口函數(shù)的實現(xiàn)。那具體到Stream.filter()中,它表達的是什么呢?看下圖:可以看出它表達的是一個Predicate接口,在英語中這個單詞的意思是:謂詞。

file

什么是謂詞?(百度百科)

file

什么是謂詞邏輯?

WHERE 和 AND 限定了主語employee是什么,那么WHERE和AND語句所代表的邏輯就是謂詞邏輯

SELECT *
FROM employee
WHERE age > 70
AND gender = 'M'

三、謂詞邏輯的復用

通常情況下,filter函數(shù)中l(wèi)ambda表達式為一次性使用的謂詞邏輯。如果我們的謂詞邏輯需要被多處、多場景、多代碼中使用,通常將它抽取出來單獨定義到它所限定的主語實體中。 比如:將下面的謂詞邏輯定義在Employee實體class中。

   public static Predicate<Employee> ageGreaterThan70 = x -> x.getAge() >70;
   public static Predicate<Employee> genderM = x -> x.getGender().equals("M");

3.1.and語法(并集)

List<Employee> filtered = employees.stream()
        .filter(Employee.ageGreaterThan70.and(Employee.genderM))
        .collect(Collectors.toList());

輸出如下:

[Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin)]

3.2.or語法(交集)

List<Employee> filtered = employees.stream()
        .filter(Employee.ageGreaterThan70.or(Employee.genderM))
        .collect(Collectors.toList());

輸出如下:實際上就是年齡大于70的和所有的男性(由于79的那位也是男性,所以就是所有的男性)

[Employee(id=1, age=23, gender=M, firstName=Rick, lastName=Beethovan), Employee(id=3, age=43, gender=M, firstName=Ricky, lastName=Martin), Employee(id=4, age=26, gender=M, firstName=Jon, lastName=Lowman), Employee(id=6, age=15, gender=M, firstName=David, lastName=Feezor), Employee(id=8, age=79, gender=M, firstName=Alex, lastName=Gussin), Employee(id=10, age=45, gender=M, firstName=Naveen, lastName=Jain)]

3.3.negate語法(取反)

List<Employee> filtered = employees.stream()
        .filter(Employee.ageGreaterThan70.or(Employee.genderM).negate())
        .collect(Collectors.toList());

輸出如下:把上一小節(jié)代碼的結(jié)果取反,實際上就是所有的女性

[Employee(id=2, age=13, gender=F, firstName=Martina, lastName=Hengis), Employee(id=5, age=19, gender=F, firstName=Cristine, lastName=Maria), Employee(id=7, age=68, gender=F, firstName=Melissa, lastName=Roy), Employee(id=9, age=15, gender=F, firstName=Neetu, lastName=Singh)]

以上就是java基礎(chǔ)理論Stream的Filter與謂詞邏輯的詳細內(nèi)容,更多關(guān)于java Stream的Filter與謂詞邏輯的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java后臺接受到圖片后保存方法

    java后臺接受到圖片后保存方法

    在本篇文章里小編給大家整理了關(guān)于java后臺接受到圖片后怎么保存的相關(guān)知識點,需要的朋友們參考學習下。
    2019-06-06
  • java 抽象類與接口的區(qū)別介紹

    java 抽象類與接口的區(qū)別介紹

    這篇文章主要介紹了java 抽象類與接口的區(qū)別介紹的相關(guān)資料,需要的朋友可以參考下
    2016-10-10
  • 排序算法圖解之Java插入排序

    排序算法圖解之Java插入排序

    插入排序是一種最簡單的排序方法,它的基本思想是將一個記錄插入到已經(jīng)排好序的有序表中,從而一個新的、記錄數(shù)增1的有序表。本文通過圖片合示例講解了插入排序的實現(xiàn),需要的可以了解一下
    2022-11-11
  • SpringBoot引入swagger報錯處理的解決方法

    SpringBoot引入swagger報錯處理的解決方法

    這篇文章主要給大家介紹SpringBoot引入swagger是會出現(xiàn)報錯的處理解決方法,文中有詳細的解決過程,感興趣的小伙伴可以跟著小編一起來學習吧
    2023-06-06
  • spring boot使用自定義注解做AOP的案例代碼

    spring boot使用自定義注解做AOP的案例代碼

    這篇文章主要介紹了spring boot使用自定義注解做AOP的案例代碼,代碼簡單易懂,通過創(chuàng)建一個自定注解,接收一個傳值type,感興趣的朋友一起看看吧
    2024-06-06
  • SpringBoot引入Thymeleaf的實現(xiàn)方法

    SpringBoot引入Thymeleaf的實現(xiàn)方法

    這篇文章主要介紹了SpringBoot引入Thymeleaf的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 詳解eclipse創(chuàng)建maven項目實現(xiàn)動態(tài)web工程完整示例

    詳解eclipse創(chuàng)建maven項目實現(xiàn)動態(tài)web工程完整示例

    這篇文章主要介紹了詳解eclipse創(chuàng)建maven項目實現(xiàn)動態(tài)web工程完整示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法

    Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法

    這篇文章主要介紹了Windows系統(tǒng)中Java調(diào)用cmd命令及執(zhí)行exe程序的方法,主要用到了IOException類,需要的朋友可以參考下
    2016-03-03
  • Nacos負載均衡策略總結(jié)

    Nacos負載均衡策略總結(jié)

    Nacos 作為目前主流的微服務中間件,包含了兩個頂級的微服務功能:配置中心和注冊中心,本文給大家總結(jié)了幾種Nacos負載均衡策略,通過圖文結(jié)合介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • Java如何實現(xiàn)支付寶電腦支付基于servlet版本

    Java如何實現(xiàn)支付寶電腦支付基于servlet版本

    這篇文章主要介紹了Java如何實現(xiàn)支付寶電腦支付基于servlet版本,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論

曲靖市| 渑池县| 双流县| 建湖县| 鹤峰县| 进贤县| 南通市| 永定县| 万盛区| 色达县| 土默特左旗| 含山县| 醴陵市| 日喀则市| 霍城县| 昌黎县| 丰城市| 类乌齐县| 陆川县| 乌海市| 侯马市| 延川县| 共和县| 玉山县| 扶余县| 泸西县| 奉节县| 青海省| 东宁县| 枝江市| 任丘市| 阿克苏市| 个旧市| 文安县| 河间市| 安宁市| 阜宁县| 诸城市| 永顺县| 双江| 东丰县|