2017-09-09 6 views
3

Je objet employéApplication ou prédicat Java 8

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; 

J'ai deux prédicats

public static Predicate<Employee> firstNameLike(final String name) { 
     return p -> p.getFirstName().contains(name); 
    } 


    public static Predicate<Employee> isAdultFemale() { 
     return p -> p.getAge() > 18 && p.getGender().equalsIgnoreCase("F"); 
    } 

Je pose ma candidature plusieurs filtres employés par exemple

public class TestEmployeePredicates { 
    public static void main(String[] args) { 

     Employee e2 = new Employee(2, 13, "F", "Martina", "Hengis"); 
     Employee e5 = new Employee(5, 19, "F", "Cristine", "Maria"); 
     Employee e7 = new Employee(7, 68, "F", "Melissa", "Roy"); 
     Employee e9 = new Employee(9, 15, "F", "Neetu", "Singh"); 


     Employee e1 = new Employee(1, 23, "M", "Rick", "Beethovan"); 
     Employee e3 = new Employee(3, 43, "M", "Ricky", "Martin"); 
     Employee e4 = new Employee(4, 26, "M", "Jon", "Lowman"); 
     Employee e6 = new Employee(6, 15, "M", "David", "Feezor"); 
     Employee e8 = new Employee(8, 79, "M", "Alex", "Gussin"); 
     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})); 


     List<Predicate<Employee>> predicates = new ArrayList<>(); 


     predicates.add(EmployeePredicates.isAdultFemale()); 
     predicates.add(EmployeePredicates.firstNameLike("J")); 


     final Predicate<Employee> employeePredicate = predicates.stream().reduce(Predicate::and).get(); 

     //OR adult male 
     employeePredicate.or(EmployeePredicates.isAdultMale()); 


     final List<Employee> collect = employees.stream().filter(employeePredicate).collect(Collectors.toList()); 

     System.out.println(collect.size()); 

Selon ma logique, il doit vérifier la liste

si son AdultFemale et firstname like "J" OU son Adult Male

Mais cela ne fonctionne pas selon la logique. Qu'est-ce que je fais mal ici? Même si l'employé est adulte MALE son filtrage.

Répondre

10

or ne modifie pas l'objet Predicate il est utilisé sur, il un rendementPredicate avec cette logique. Ici, puisque vous n'avez pas assigné la valeur de retour où vous venez de la perdre, l'appel or ne fait rien. Au lieu de cela, vous devriez l'enregistrer dans une variable. E.g .:

final Predicate<Employee> employeePredicate = 
    predicates.stream().reduce(Predicate::and).get(); 

// OR adult male 
// Note that the result is saved back to employeePredicate 
employeePredicate = employeePredicate.or(EmployeePredicates.isAdultMale()); 
+1

Merci beaucoup! J'aimerais avoir un aperçu de l'API elle-même! Merci beaucoup. Je suis nouveau à Java 8 – Makky