我们经常操作List,例如现在有一个功能要求在所有人中筛选出年龄在20岁以上的人。

public class MyTest {
    private final List<Person> allPersonList;
 
    {
        Person p1 = new Person("风清扬"42);
        Person p2 = new Person("独孤求败"66);
        Person p3 = new Person("令狐冲"16);
        Person p4 = new Person("东方不败"25);
        allPersonList = ImmutableList.of(p1, p2, p3, p4);
    }
 
    @Test
    public void test() {
        List<Person> ageGreateThanTwenty = getAgeGreateThanTwenty();
        System.out.println(ageGreateThanTwenty);
    }
 
    private List<Person> getAgeGreateThanTwenty() {
        List<Person> persons = Lists.newArrayList();
        for (Person p : allPersonList) {
            if (p.getAge() > 20) {
                persons.add(p);
            }
        }
        return persons;
    }
}

上述代码很好的完成了需求,这时候需求要求增加查询大于三十岁的人的需求,那也好说,再写一个方法getAgeGreateThanThirty,这当然是开个玩笑,肯定是把年龄当做参数传入来写。

private List<Person> getAgeGreateThan(int age) {
    List<Person> persons = Lists.newArrayList();
    for (Person p : allPersonList) {
        if (p.getAge() > age) {
            persons.add(p);
        }
    }
    return persons;
}

非常容易对不对,这个时候需求又出现了小于。等于。小于等于,大于等于,小于多少并且大于多少,这就有点麻烦了,用一个过滤器来过滤他们吧。

public void test() {
    List<Person> ageGreateThanTwenty = filter(allPersonList, p -> p.getAge() >= 30);
    System.out.println(ageGreateThanTwenty);
}
 
private List<Person> filter(List<Person> persons, Predicate<Person> predicate) {
    List<Person> result = Lists.newArrayList();
    for (Person person : persons) {
        if (predicate.test(person)) {
            result.add(person);
        }
    }
    return result;
}

这个时候可就是需求你尽管改,我只要变成新的过滤代码传进去就可以完成,但是上述做法还不够好的一点就是固定了Person类,改成泛型,灵活性会更好。

public void test() {
    List<Person> ageGreateThanTwenty = filter(allPersonList, p -> p.getAge() >= 30);
    System.out.println(ageGreateThanTwenty);
}
 
private <T> List<T> filter(List<T> lists, Predicate<T> predicate) {
    List<T> result = Lists.newArrayList();
    for (T t : lists) {
        if (predicate.test(t)) {
            result.add(t);
        }
    }
    return result;
}

(5)函数式接口的简单使用之Predicate的更多相关文章

  1. java8实战二------lambda表达式和函数式接口,简单就好

    一.Lambda 可以把Lambda表达式理解为简洁地i表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表.函数主体.返回类型,可能还是一个可以抛出的异常列表. 听上去,跟我们用的匿名类,匿名 ...

  2. [六] 函数式接口的复合方法示例 predicate 谓词逻辑运算 Function接口 组合运算 比较器 逆序 比较链

    复合的方法 有些函数式接口提供了允许复合的方法 也就是可以将Lambda表达式复合成为一个更加复杂的方法 之前的章节中有说到: 接口中的compose, andThen, and, or, negat ...

  3. 函数式接口的使用 (Function、Predicate、Supplier、Consumer)

    参考:https://blog.csdn.net/jmj18756235518/article/details/81490966 函数式接口 定义:有且只有一个抽象方法的接口 Function< ...

  4. 乐字节-Java8新特性之函数式接口

    上一篇小乐带大家学过 Java8新特性-Lambda表达式,那什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口 ...

  5. 乐字节-Java8核心特性实战之函数式接口

    什么时候可以使用Lambda?通常Lambda表达式是用在函数式接口上使用的.从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一 ...

  6. Java8 新特性 函数式接口

    什么是函数式接口   函数式接口是Java8引用的一个新特性,是一种特殊的接口:SAM类型的接口(Single Abstract Method).但是它还是一个接口,只是有些特殊罢了.  函数式接口的 ...

  7. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  8. java8新特性-函数式接口详细讲解及案例

    一.函数式接口 1.1 概念 函数式接口在Java中是指:有且仅有一个抽象方法的接口.函数式接口,即适用于函数式编程场景的接口.而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适 ...

  9. Java8 Functional(函数式接口)

    Functional 函数式(Functional)接口 只包含一个抽象方法的接口,称为函数式接口. 你可以通过 Lambda 表达式来创建该接口的对象.(若 Lambda 表达式抛出一个受检异常(即 ...

随机推荐

  1. 20145301《网络对抗》shellcode注入&Return-to-libc攻击深入

    20145301<网络对抗>shellcode注入&Return-to-libc攻击深入 Shellcode注入 shellcode是什么? Shellcode是指能完成特殊任务的 ...

  2. Linux内核分析 03

    一,构造一个简单的Linux系统MenuOS 1.Linux内核源代码简介 回顾一下前面的三大法宝和两把宝剑. arch/x86目录下的代码需要重点关注 阅读代码的时候把除了x86以外的都删掉会有利于 ...

  3. Javaworkers团队第二周项目总结

    本周项目进展 本周我们小组成员在图书馆和网上查阅了很多资料,基本达到了预期的计划,完成了项目框架设计及代码模块设计. 设计思路 1.首先,根据用户需求合理分配代码密度,即: 用户直接操作(点击运行)的 ...

  4. HashMap 遍历的两种方式及性能比较

    HashMap 是Java开发中经常使用的数据结构.相信HashMap 的基本用法你已经很熟悉了.那么我们该如何遍历HashMap 呢?哪种遍历方式的性能更好呢?本篇文章来为你解决这个疑惑. 一.Ha ...

  5. 从0开始学习 GITHUB 系列之「GIT 进阶」【转】

    本文转载自:http://stormzhang.com/github/2016/06/16/learn-github-from-zero5/ 版权声明:本文为 stormzhang 原创文章,可以随意 ...

  6. 《Effective Java 2nd》第8章 通用程序设计

    目录 第45条 将局部变量的作用域最小化 第46条 for-each循环优先于传统的for循环 第47条 了解和使用类库 第48条 如果需要精确的答案,避免使用float和double 第49条 基本 ...

  7. 下载百度网盘破解 获得 所下载视频URL 粘贴到thunder

    Chrome:方法1. 进入谷歌商城,搜索baidudl.安装即可. 方法2. 下载baidudl.zip.解压获得baidudl文件夹.进入chrome://extensions/,勾选右上角Dev ...

  8. Mac adb 安装

    一.下载Android studio https://developer.android.google.cn/studio/ 二.安装 首先移动 弹出下面弹框,直接点击OK 提示无法访问Android ...

  9. Spring IOC 源码简单分析 03 - 循环引用

    ### 准备 ## 目标 了解 Spring 如何处理循环引用 ##测试代码 gordon.study.spring.ioc.IOC03_CircularReference.java   ioc03. ...

  10. 2018-2019-2 20165332《网络攻防技术》Exp5 MSF基础应用

    2018-2019-2 20165332<网络攻防技术>Exp5 MSF基础应用 1.基础问题回答 用自己的话解释什么是exploit,payload,encode. exploit:就是 ...