使用Java 8中的map函数键入cast不起作用

时间:2017-07-21 10:59:49

标签: java list lambda functional-programming

我正在比较两个清单。

List allUserGroups = UserBC.getAllGroupsForUser(userId, deptID);
List<String> confUserGroups= Arrays.asList(configuredSet);

List one返回我需要对GroupData实体进行类型转换的Object。 GroupData有多个字段,想要比较其中一个字段'id'。所以我使用map函数进行类型转换,如下所示,

isValuePresent = allUserGroups.stream().map(p -> (GroupData) p).anyMatch(p -> confUserGroups.contains(p.getId()));

问题是,对于p.getId(),它再次要求进行类型转换。编译器要求再次添加强制转换。任何人都可以建议我是否遗漏了什么。

EDIT1: id是long类型,否则我可以使用((GroupData)p).getId()

EDIT2: 修改了Joop回答的代码,但得到了相同的错误

enter image description here

5 个答案:

答案 0 :(得分:1)

两个p都是不同的变量。

isValuePresent = allUserGroups.stream()
    .map(GroupData.class::cast)
    .anyMatch(p -> confUserGroups.contains(p.getId()));

isValuePresent = allUserGroups.stream()
    .map(GroupData.class::cast)
    .map(GroupData::getId)
    .anyMatch(confUserGroups::contains);

答案 1 :(得分:1)

如果您已经知道列表中值的类型,则可以强制转换列表,然后使用流。

List<GroupData> list = (List<GroupData>)UserBC.getAllGroupsForUser(userId, deptID);
confUserGroups= Arrays.asList(configuredSet);

isValuePresent = allUserGroups.stream().anyMatch(p -> confUserGroups.contains(p.getId()));

答案 2 :(得分:0)

添加String.valueOf并直接强制转换id解决了我的问题。

isValuePresent = allUserGroups.stream().anyMatch(p -> configuredVipUserGroups.contains(String.valueOf(((GroupData) p).getId())));

但我仍然想知道为什么.map(p -> (GroupData) p) 无法进行类型转换。

答案 3 :(得分:0)

您可能会尝试使用以下内容:

allUserGroups.stream()
    .map(GroupData.class::cast)
    .map(GroupData::getID)
    .anyMatch(confUserGroups.contains)

例如String类:

List<Object> list = Arrays.asList("a","ab","abc");
list.stream()
        .map(String.class::cast) // cast to String
        .map(String::getBytes) // call getBytes on every element
        .forEach(System.out::println); 

答案 4 :(得分:0)

使用cast in contains函数,无需在其之前进行强制转换。

isValuePresent = allUserGroups.stream()
                            .map(p -> p)
                            .anyMatch(p -> confUserGroups.contains( (GroupData)p.getId()));