2017-09-04 130 views
-3

爲什麼此代碼不能編譯。我正在學習Java中的Predicate。下面是代碼Java 8 Innner類實例化

package com.java8.lambda.predicate; 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 
import java.util.function.Predicate; 
import java.util.stream.Collectors; 

import com.java8.lambda.pojo.Employee; 

public class PredicateSample { 
    public static void main(String[] args) { 
     Employee permanentEmployee = new Employee(70, "Jagmohan", "Sanyal", new Date(), 'M', 19900.87,"P"); 
     Employee tempEmployee = new Employee(70, "Shruti", "Bhatia", new Date(), 'F', 1990.87,"C"); 

     List<Employee> empList = new ArrayList<>(); 
     empList.add(permanentEmployee); 
     empList.add(tempEmployee); 

     PredicateSample predicateSample = new PredicateSample(); 
     //Code doesn't compile on this line due to non-visibility of EmployeePredicate class 
     //It fails with "PredicateSample.EmployeePredicate cannot be resolved to a type" 
     EmployeePredicate empPredicate = new PredicateSample().new EmployeePredicate(); 
    } 

} 

class EmployeePredicate { 

    public Predicate<Employee> getOlderEmployee(){ 
     return p -> p.getAge() > 60 && p.getEmploymentType().equalsIgnoreCase("P"); 
    } 

    public List<Employee> filter(List<Employee> employees, Predicate<Employee> p){ 
     return employees.stream().filter(p).collect(Collectors.toList()); 
    } 
} 

我已經通過下面的鏈接Inner Class Instantiation

走後,我也經歷了其他網站,但無法找出問題。

+5

'EmployeePredicate'不是'PredicateSample'的內部類, –

回答

2

您需要內部類實際上內部類。

public class PredicateSample { 
    public static void main(String[] args) { 
     Employee permanentEmployee = new Employee(70, "Jagmohan", "Sanyal", new Date(), 'M', 19900.87,"P"); 
     Employee tempEmployee = new Employee(70, "Shruti", "Bhatia", new Date(), 'F', 1990.87,"C"); 

     List<Employee> empList = new ArrayList<>(); 
     empList.add(permanentEmployee); 
     empList.add(tempEmployee); 

     PredicateSample predicateSample = new PredicateSample(); 
     //Code doesn't compile on this line due to non-visibility of EmployeePredicate class 
     //It fails with "PredicateSample.EmployeePredicate cannot be resolved to a type" 
     EmployeePredicate empPredicate = new PredicateSample().new EmployeePredicate(); 
    } 

    // **inner** class. 
    class EmployeePredicate { 

     public Predicate<Employee> getOlderEmployee(){ 
      return p -> p.getAge() > 60 && p.getEmploymentType().equalsIgnoreCase("P"); 
     } 

     public List<Employee> filter(List<Employee> employees, Predicate<Employee> p){ 
      return employees.stream().filter(p).collect(Collectors.toList()); 
     } 
    } // < --- end of **inner** class 
} // < --- end of **outer** class.