• Java 8 基础教程


    在Java 8中,Predicate是一个函数式接口,可以被应用于lambda表达式和方法引用。其抽象方法非常简单:

    /**
         * Evaluates this predicate on the given argument.
         *
         * @param t the input argument
         * @return {@code true} if the input argument matches the predicate,
         * otherwise {@code false}
         */
    boolean test(T t);

    即对t进行断言,返回true或者false。 例如:在filter中 就会接收一个Predicate

    /**
     * Returns a stream consisting of the elements of this stream that match
     * the given predicate.
     *
     * <p>This is an <a href="package-summary.html#StreamOps">intermediate
     * operation</a>.
     *
     * @param predicate a non-interfering stateless predicate to apply to each element to determine if it
     * should be included in the new returned stream.
     * @return the new stream
     */
    Stream<T> filter(Predicate<? super T> predicate);

    下面来演示一下如何使用Predicate

    package predicateExample;
     
    public class Employee {
        
       public Employee(Integer id, Integer age, String gender, String fName, String lName){
           this.id = id;
           this.age = age;
           this.gender = gender;
           this.firstName = fName;
           this.lastName = lName;
       }
         
       private Integer id;
       private Integer age;
       private String gender;
       private String firstName;
       private String lastName;
     
       //Please generate Getter and Setters
     
        @Override
        public String toString() {
            return this.id.toString()+" - "+this.age.toString(); //To change body of generated methods, choose Tools | Templates.
        }
    public static Predicate<Employee> isAdultMale() {
        return p -> p.getAge() > 21 && p.getGender().equalsIgnoreCase("M");
    }
    public static Predicate<Employee> isAdultFemale() {
        return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F");
    }
    public static Predicate<Employee> isAgeMoreThan(Integer age) {
        return p -> p.getAge() > age;
    }
    } 

    上面的代码定义了多个Predicate,分别对应多个筛选条件,下面开始使用这些断言:

    package predicateExample;
     
    import java.util.List;
    import java.util.function.Predicate;
    import java.util.stream.Collectors;
     
    public class EmployeePredicates
    {
        public static Predicate<Employee> isAdultMale() {
            return p -> p.getAge() > 21 && p.getGender().equalsIgnoreCase("M");
        }
         
        public static Predicate<Employee> isAdultFemale() {
            return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F");
        }
         
        public static Predicate<Employee> isAgeMoreThan(Integer age) {
            return p -> p.getAge() > age;
        }
         
        public static List<Employee> filterEmployees (List<Employee> employees, Predicate<Employee> predicate) {
            return employees.stream().filter( predicate ).collect(Collectors.<Employee>toList());
        }
    }  
    package predicateExample;
     
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import static predicateExample.EmployeePredicates.*;
     
    public class TestEmployeePredicates {
        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 = new ArrayList<Employee>();
            employees.addAll(Arrays.asList(new Employee[]{e1,e2,e3,e4,e5,e6,e7,e8,e9,e10}));
                    
            System.out.println(filterEmployees(employees, isAdultMale()));
             
            System.out.println(filterEmployees(employees, isAdultFemale()));
             
            System.out.println(filterEmployees(employees, isAgeMoreThan(35)));
             
            //Employees other than above collection of "isAgeMoreThan(35)" can be get using negate()
            System.out.println(filterEmployees(employees, isAgeMoreThan(35).negate()));
        }
    }

    输出:

    [1 - 23, 3 - 43, 4 - 26, 8 - 79, 10 - 45]
    [5 - 19, 7 - 68]
    [3 - 43, 7 - 68, 8 - 79, 10 - 45]
    [1 - 23, 2 - 13, 4 - 26, 5 - 19, 6 - 15, 9 - 15]
    正则表达式表示为Predicate

    可以通过Pattern.compile().asPredicate()将正则表达式转换为Predicate。 在Java 8之前,从一个数组中找出符合正则规则的字符串的方法是

    public static void main(String[] args)
    {
         
        Pattern pattern = Pattern.compile("^(.+)@example.com$");
         
        // Input list
        List<String> emails = Arrays.asList("alex@example.com", "bob@yahoo.com",
                            "cat@google.com", "david@example.com");
          
        for(String email : emails)
        {
            Matcher matcher = pattern.matcher(email);
             
            if(matcher.matches())
            {
                System.out.println(email);
            }
        }
    }

    转换为Predicat为:

    import java.util.Arrays;
    import java.util.List;
    import java.util.function.Predicate;
    import java.util.regex.Pattern;
    import java.util.stream.Collectors;
     
    public class RegexPredicateExample {
        public static void main(String[] args) {
            // Compile regex as predicate
            Predicate<String> emailFilter = Pattern
                                            .compile("^(.+)@example.com$")
                                            .asPredicate();
     
            // Input list
            List<String> emails = Arrays.asList("alex@example.com", "bob@yahoo.com",
                                "cat@google.com", "david@example.com");
     
            // Apply predicate filter
            List<String> desiredEmails = emails
                                        .stream()
                                        .filter(emailFilter)
                                        .collect(Collectors.<String>toList());
     
            // Now perform desired operation
            desiredEmails.forEach(System.out::println);
        }
    }
    原文连接:https://www.codemore.top/cates/Backend/post/2018-05-06/predicate
  • 相关阅读:
    3星|《腾讯产业森林:AI时代的创业密码》:后半部分是较详细的创业指南,前面泛泛介绍腾讯、AI
    3星|《三联生活周刊》2017年49期:小孩子一般在3岁时开始学会说“黑色”谎言,也就是专门利己毫不利人的谎言
    VS2010调试 --指南 Reference from : http://blog.csdn.net/kingzone_2008/article/details/8133048
    画图------Brush
    JavaScript Function.apply() 函数详解
    window.addEventListener来解决让一个js事件执行多个函数
    C# 框架是什么?MVC是什么 ?工厂模式是什么?设计模式是什么?三层架构是什
    C#反射机制介绍
    javascript 小日历
    javascript里的post和get有什么区别
  • 原文地址:https://www.cnblogs.com/hitandrew/p/9007451.html
Copyright © 2020-2023  润新知