Java中的lambda表达式ClassCastException

Java中的lambda表达式ClassCastException,java,java-8,casting,java-stream,Java,Java 8,Casting,Java Stream,我正在努力学习Java8中的流媒体技术。以下是我的代码: Main.java public class Main { public static void main(String[] args) { Person person = new Person("FirstName", "LastName"); List<Person> personList = new ArrayList<>(); personList.

我正在努力学习Java8中的流媒体技术。以下是我的代码:

Main.java

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

        Person person = new Person("FirstName", "LastName");
        List<Person> personList = new ArrayList<>();
        personList.add(person);

        Place place = new Place("name", "country");
        List<Place> placeList = new ArrayList<>();
        placeList.add(place);


        List<List<Object>> objects = new ArrayList<>();
        objects.add(Collections.singletonList(personList));
        objects.add(Collections.singletonList(placeList));

        List<Object> persons = objects.get(0);
        List<String> firstNames = persons.stream()
                .map(o -> ((Person)o).getFirstName())
                .collect(Collectors.toList());

        firstNames.forEach(System.out::println);
    }
}
@Data
public class Person {
    String firstName;
    String lastName;

    public Person(String firstName, String lastName) {
        setFirstName(firstName);
        setLastName(lastName);
    }
}
@Data
public class Place {
    String name;
    String country;

    public Place(String name, String country) {
        setName(name);
        setCountry(country);
    }
}
Place.java

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

        Person person = new Person("FirstName", "LastName");
        List<Person> personList = new ArrayList<>();
        personList.add(person);

        Place place = new Place("name", "country");
        List<Place> placeList = new ArrayList<>();
        placeList.add(place);


        List<List<Object>> objects = new ArrayList<>();
        objects.add(Collections.singletonList(personList));
        objects.add(Collections.singletonList(placeList));

        List<Object> persons = objects.get(0);
        List<String> firstNames = persons.stream()
                .map(o -> ((Person)o).getFirstName())
                .collect(Collectors.toList());

        firstNames.forEach(System.out::println);
    }
}
@Data
public class Person {
    String firstName;
    String lastName;

    public Person(String firstName, String lastName) {
        setFirstName(firstName);
        setLastName(lastName);
    }
}
@Data
public class Place {
    String name;
    String country;

    public Place(String name, String country) {
        setName(name);
        setCountry(country);
    }
}
例外情况:

Exception in thread "main" java.lang.ClassCastException: java.util.ArrayList cannot be cast to Person
    at Main.lambda$main$0(Main.java:28)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Collections$2.tryAdvance(Collections.java:4717)
    at java.util.Collections$2.forEachRemaining(Collections.java:4725)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at Main.main(Main.java:29)
我有
List
List
,它保存着
Object
(我正在使用
Object
,因为我想使用不同类型的对象存储到集合中)。我正在将
Person
的集合和
Place
的集合存储到
List
集合的
列表中

在流媒体中,我试图获得所有人中唯一的
firstName
。但是,当我使用lamba表达式遍历每个元素并获得firstName时,它不适用于强制转换

问题:

  • 我做错什么了吗
  • 是否有其他方法(流媒体中的
    map
    除外)使用流API获取Person对象的所有名字

  • 个人列表
    是个人的列表

    Collections.singletonList(personList)
    是个人列表的列表

    对象
    是人员/地点列表的列表

        List<Object> persons = objects.get(0);   // persons is a List of List of Person
        List<String> firstNames = persons.stream()  
        //each element in the stream is a List of Person, so you cannot cast it to Person.
                .map(o -> ((Person)o).getFirstName())
                .collect(Collectors.toList());
    
    List persons=objects.get(0);//“人员”是一个人员列表
    List firstNames=persons.stream()
    //流中的每个元素都是Person的列表,因此不能将其强制转换为Person。
    .map(o->((Person)o).getFirstName()
    .collect(Collectors.toList());
    
    您可以删除singletonList函数,以降低列表级别:

        List<List<?>> objects = new ArrayList<>();
        objects.add(personList);
        objects.add(placeList);
    

    列表
    个人列表
    是个人的列表

    Collections.singletonList(personList)
    是个人列表的列表

    对象
    是人员/地点列表的列表

        List<Object> persons = objects.get(0);   // persons is a List of List of Person
        List<String> firstNames = persons.stream()  
        //each element in the stream is a List of Person, so you cannot cast it to Person.
                .map(o -> ((Person)o).getFirstName())
                .collect(Collectors.toList());
    
    List persons=objects.get(0);//“人员”是一个人员列表
    List firstNames=persons.stream()
    //流中的每个元素都是Person的列表,因此不能将其强制转换为Person。
    .map(o->((Person)o).getFirstName()
    .collect(Collectors.toList());
    
    您可以删除singletonList函数,以降低列表级别:

        List<List<?>> objects = new ArrayList<>();
        objects.add(personList);
        objects.add(placeList);
    

    list要删除
    singletonList
    ,必须将声明更改为
    List@Holger不一定。对象是所有对象的根类,任何对象都可以声明为对象。比如'Object o=newarraylist()“没关系。您不能将
    列表
    分配给
    列表
    类型的变量,因此,您不能将
    列表
    存储到
    列表
    @Holger我明白您的意思。是的,你是对的。更新的应答要删除
    单音列表
    ,您必须将声明更改为
    List@Holger不一定。对象是所有对象的根类,任何对象都可以声明为对象。像`Object o=new ArrayList()”这没关系。你不能将
    列表
    分配给
    列表
    类型的变量,因此,你不能将
    列表
    存储到
    列表
    中。我明白你的意思。是的,你是对的。更新答案