Как написать функцию применения интерфейса функции в функции stream.map? - PullRequest
3 голосов
/ 12 июля 2020

Учитывая ArrayList с 5 объектами Employee (id, name, location, salary), напишите программу для извлечения информации о местоположении каждого Employee и сохранения их в ArrayList с помощью Function.

Я хочу использовать для этого вопроса функцию stream.map.

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

class Employee{
    int id;
    String name;
    String location;
    int salary;
    
    Employee(int id,String name,String location,int salary){
        this.id=id;
        this.name=name;
        this.location=location;
        this.salary=salary;
    }
}


public class JAVA8 {
    public static void main(String[] args){
         ArrayList<Employee> al=new ArrayList<Employee>();
         Employee e=new Employee(123,"Muskan","Rajasthan",34000);
         Employee e1=new Employee(456,"Sonali","Maharashtra",45003);
         Employee e2=new Employee(789,"Khushboo","LaxmanGarh",22222);
         Employee e3=new Employee(012,"Minakshi","USA",22);
         al.add(e);
         al.add(e1);
         al.add(e2);
         al.add(e3);
         Function<Employee,String> f1=(s)->(s.location);
         String a;
         List<String> li=al.stream()
                                .map(Employee::apply)
                                .collect(Collectors.toList());
        }

}  

Но я получаю сообщение об ошибке в этой строке - .map(Employee:: apply). Я хочу использовать String s=f1.apply(employeeObject) на карте. Как это сделать

Ответы [ 2 ]

4 голосов
/ 12 июля 2020

Employee не имеет метода apply.

Вы должны передать экземпляр f1, который реализует Function<Employee,String>, в map():

List<String> li=al.stream()
                  .map(f1)
                  .collect(Collectors.toList());

PS это было бы лучше использовать геттер вместо прямого доступа к переменной экземпляра:

  • с лямбда Function<Employee,String> f1 = s -> s.getLocation();

  • со ссылкой на метод Function<Employee,String> f1 = Employee::getLocation;

Конечно, можно и без f1:

List<String> li=al.stream()
                  .map(Employee::getLocation)
                  .collect(Collectors.toList());
2 голосов
/ 12 июля 2020

В классе Employee нет применимого метода. Вы можете использовать функцию напрямую

Function<Employee,String> f1=(s)->(s.location);
List<String> li=al.stream().map(f1).collect(Collectors.toList());

Или использовать лямбда внутри map ()

List<String> li=al.stream().map(s->s.location).collect(Collectors.toList());
...