【问题标题】:Type cast not working using map function in Java 8类型转换在 Java 8 中使用 map 函数不起作用
【发布时间】:2017-12-27 09:43:49
【问题描述】:

我正在比较两个列表。

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

列表一返回我需要类型转换为 GroupData 实体的对象。 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回答的代码,但得到同样的错误

【问题讨论】:

  • 你能给我们一个错误信息吗?
  • 您应该可以跳过map 部分。只需在((GroupData)p).getId() 上进行投射
  • @jensgram 我已经编辑了我的问题。这里的问题是“id”是长类型的,我再次需要将其转换为字符串以进行比较。这就是我进行类型转换的原因
  • @VikasYadav 你错过了一个额外的演员.map(GroupData::getId).anyMatch(configuredVipUsetGroups::contains)
  • @AntonBalaniuc 我也试过了,isValuePresent = allUserGroups.stream() .map(GroupData.class::cast) .map(GroupData::getId) .anyMatch(confUserGroups::contains); 但是在这里得到,'GroupData 类型没有定义适用于此的 getId(Object)',因为 getId 没有任何参数。

标签: java list lambda functional-programming


【解决方案1】:

你可能会尝试使用这样的东西:

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

【讨论】:

    【解决方案2】:

    两个 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);
    

    【讨论】:

    • 您的答案的第一部分是抛出相同的错误 i。 e 将演员表添加到 p。对于第二部分,获取“GroupData 类型未定义适用于此处的 getId(Object)”。 getId 没有任何参数。
    【解决方案3】:

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

    List<GroupData> allUserGroups = (List<GroupData>)UserBC.getAllGroupsForUser(userId, deptID);
    confUserGroups= Arrays.asList(configuredSet);
    
    isValuePresent = allUserGroups.stream().anyMatch(p -> confUserGroups.contains(p.getId()));
    
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        在包含函数中使用强制转换,无需在它之前强制转换。

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

        【讨论】:

        • 检查edit1,id是long类型,否则我可以使用((GroupData)p).getId()
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 2014-01-23
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        相关资源
        最近更新 更多