2

我正在尝试在 java 8 中学习流式传输。以下是我的代码:

主.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);
    }
}

人.java

@Data
public class Person {
    String firstName;
    String lastName;

    public Person(String firstName, String lastName) {
        setFirstName(firstName);
        setLastName(lastName);
    }
}

Place.java

@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(我正在使用,因为我想使用不同类型的对象存储到集合中)。我将集合和集合存储到集合中。ListObjectObjectPersonPlaceListList

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

问题:

  1. 我做错什么了吗?
  2. 是否有任何其他方式(除了map流式传输)使用流 API 获取 Person 对象的所有 FirstName?
4

1 回答 1

6

personList是人员列表

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

objects是人员/地点列表的列表。

    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());

您可以删除 singletonList 函数,以便减少列表级别:

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

或者在你做地图时更深入地列出一个列表:

    List<String> firstNames = persons.stream() 
            //Because persons is declared as List of Objects, so you need to cast each element into a List before calling get 
            .map(o -> ((Person)((List)o).get(0))).getFirstName())
            .collect(Collectors.toList());
于 2019-07-17T23:19:27.783 回答