我正在比较两个清单。
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回答的代码,但得到了相同的错误
答案 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()));