我们经常操作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. 高级bash脚本编程(三)

    高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...

  2. [UI基础][不会说话的汤姆猫]

    会说话的汤姆猫这个APP层级风靡一时,其UI部分就是利用了序列动画的技术, 接下来 我们用汤姆猫来演示怎么制作序列动画. [要求]: 1.学会使用序列动画的方法 2.学会分析动画播放中内存占用高的问题 ...

  3. HDU 4272 LianLianKan (状压DP+DFS)题解

    思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...

  4. python第三方库PIL安装的各种坑

    PIL python的图像处理库,pycharm安装屡次失败,始终报错 果断换依旧报错,查遍所有博客, 有给pip加参数的,pip install PIL --allow-external PIL - ...

  5. lapply

    正如前面展示的,lapply( )函数接收一个向量和一个函数作为输入参数.它将这个函数应用到向量中的每个元素,再将结果以列表的形式返回.当每次迭代都是相互独立时,这个函数就非常好用.因为在这种情况下, ...

  6. redis高可用 - Master&Slave

    Master&Slave也就是我们所说的主从复制,即主机数据更新后根据配置和策略,自动同步到备机的机制.其中Master以写为主,Slave以读为主. Master&Slave的作用主 ...

  7. Java回顾之集合

    在这篇文章里,我们关注Java中的集合(Collection).集合是编程语言中基础的一部分,Java自JDK早期,就引入了Java Collection Framework.设计JCF的那个人,后来 ...

  8. java中interrupt、join、sleep、notify、notifyAll、wait详解

    首先介绍一下中断概念:举个例子容易理解一点 例子:假如你正在给朋友写信,电话铃响了.这时,你放下手中的笔,去接电话.通话完毕,再继续写信.这个例子就表现了中断及其处理过程:电话铃声使你暂时中止当前的工 ...

  9. Hibernate批量处理数据、[HQL连接查询]

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使 ...

  10. Gitlab项目用ssh克隆

    Gitlab项目用ssh克隆 1.  新建一个文件夹并用git bash here 打开 2.  在git bash here 输入命令行 ssh-keygen –t rsa –C“邮箱名” 3.  ...