我们经常操作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. jQuery Mobile中的页面加载与跳转机制

    第一次做用jQuery Mobile做东西,发现一些跟平时的思维习惯不太一样的.其中这个框架的页面加载机制便是其中一个.如果不明白其中的奥秘,往往会出现一些让人摸不着头脑的怪现象,比如页面进入后点击按 ...

  2. windows下利用批处理脚本监控程序

    1.要监控的程序为使用cygwin环境编译的exe可执行文件hello.exe,源码如下: #include <stdio.h> #include <unistd.h> voi ...

  3. Android移动软件开发总结

    目录 Android实验参考目录 常用知识点总结 服务绑定bind Service ThreadService使用总结 Service用法总结 Broadcast Receiver用法 Intent使 ...

  4. Gym 101334F Feel Good

    http://codeforces.com/gym/101334 题意:给定一串数,求一个区间,使得该区间的所有数之和乘以该区间内最小的数的乘积最大. 思路:先预处理一下,计算出前缀和. 我们可以把每 ...

  5. pku 2284 That Nice Euler Circuit

    题意: 给你n个点第n个点保证与第0个点相交,然后求这n个点组成的图形可以把整个平面分成几个面 思路: 这里的解题关键是知道关于多面体的欧拉定理 多面体: 设v为顶点数,e为棱数,f是面数,则v-e+ ...

  6. Qt570_CentOS64x64_01

    ZC: 其实 主要是要安装 OpenGL,具体看"3"... ... 1.运行 "/opt/Qt5.7.0/Tools/QtCreator/bin/qtcreator&q ...

  7. QWebView_QWebEngineView

    1.http://stackoverflow.com/questions/29055475/qwebview-or-qwebengineview “ QWebView uses WebKit as t ...

  8. 第108天:Ajax中XMLHttpRequest详解

    在Ajax应用程序中,XmlHttpRequest对象负责将用户信息以异步通信地发送到服务器端,并接收服务器返回的响应信息和数据. XMLHttpRequest可以提供不重新加载页面的情况下更新网页, ...

  9. 套用EVAL

    <%#getSimple(setHeight(Eval("File").ToString(), searchTxt, false), 340)%>

  10. 001——php字符串中的字符串定义

    <?php /** * 一.定义字符串: * ''单引号 ""双引号 <<<定界符 */ /* $url='http://baidu.com'; $baid ...