欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

file

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

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

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

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

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表達(dá)式(之前的章節(jié)我們已經(jīng)講過(guò)了),表達(dá)過(guò)濾年齡大于70并且男性的Employee員工。輸出如下:

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

二、什么是謂詞邏輯?

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

file

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

file

什么是謂詞邏輯?

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

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

三、謂詞邏輯的復(fù)用

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

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

3.1.and語(yǔ)法(并集)

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語(yǔ)法(交集)

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

輸出如下:實(shí)際上就是年齡大于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語(yǔ)法(取反)

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

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

[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與謂詞邏輯的詳細(xì)內(nèi)容,更多關(guān)于java Stream的Filter與謂詞邏輯的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 重新實(shí)現(xiàn)hashCode()方法

    重新實(shí)現(xiàn)hashCode()方法

    hashCode()是Java中的一個(gè)重要方法,用于計(jì)算對(duì)象的哈希碼。本文介紹了如何重新實(shí)現(xiàn)hashCode()方法,包括使用對(duì)象的屬性計(jì)算哈希碼、使用字符串拼接計(jì)算哈希碼、使用隨機(jī)數(shù)計(jì)算哈希碼等方法。同時(shí),還介紹了如何避免哈希沖突,提高哈希表的效率。
    2023-04-04
  • SpringBoot基于Redis的分布式鎖實(shí)現(xiàn)過(guò)程記錄

    SpringBoot基于Redis的分布式鎖實(shí)現(xiàn)過(guò)程記錄

    Redis是一套 key-value 高性能數(shù)據(jù)庫(kù),使用它可以大大提高我們的開(kāi)發(fā)效率,在SpringBoot中,自動(dòng)配置也幫我們節(jié)約了大量的配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot基于Redis的分布式鎖實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和)

    Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和)

    這篇文章主要介紹了Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Springboot集成OpenFeign Demo詳解

    Springboot集成OpenFeign Demo詳解

    這篇文章主要為大家詳細(xì)介紹了Springboot集成OpenFeign Demo以及參數(shù)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • 解決maven打包排除類不生效maven-compiler-plugin問(wèn)題

    解決maven打包排除類不生效maven-compiler-plugin問(wèn)題

    總結(jié):在Spring Boot項(xiàng)目B中作為項(xiàng)目A的依賴時(shí),排除啟動(dòng)類不生效的原因是被其他類引用或父POM引入,解決方法是跳過(guò)test編譯或注釋掉@SpringBootTest(classes={BApplication.class})
    2024-11-11
  • Java正則表達(dá)式之分組和替換方式

    Java正則表達(dá)式之分組和替換方式

    這篇文章主要介紹了Java正則表達(dá)式之分組和替換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 利用Java實(shí)現(xiàn)簡(jiǎn)單的詞法分析器實(shí)例代碼

    利用Java實(shí)現(xiàn)簡(jiǎn)單的詞法分析器實(shí)例代碼

    眾所周知編譯原理中的詞法分析算是很重要的一個(gè)部分,原理比較簡(jiǎn)單,不過(guò)網(wǎng)上大部分都是用C語(yǔ)言或者C++來(lái)編寫,因?yàn)樽罱趯W(xué)習(xí)Java,故用Java語(yǔ)言實(shí)現(xiàn)了簡(jiǎn)單的詞法分析器。感興趣的朋友們可以參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • Java中關(guān)于isEmpty方法、null以及““的區(qū)別

    Java中關(guān)于isEmpty方法、null以及““的區(qū)別

    這篇文章主要介紹了Java中關(guān)于isEmpty方法、null以及““的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring BeanUtils忽略空值拷貝的方法示例代碼

    Spring BeanUtils忽略空值拷貝的方法示例代碼

    本文用示例介紹Spring(SpringBoot)如何使用BeanUtils拷貝對(duì)象屬性忽略空置,忽略null值拷貝屬性的用法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2022-03-03
  • spring boot 集成dubbo的示例演示

    spring boot 集成dubbo的示例演示

    這篇文章主要介紹了spring boot 集成dubbo的示例演示,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07

最新評(píng)論