当前位置: 首页 > 知识库问答 >
问题:

Java8流映射-检查所有映射操作是否成功?

桂鑫鹏
2023-03-14

我正在尝试使用流将一个列表映射到另一个列表。

原始列表的某些元素无法映射。也就是说,映射函数可能无法找到合适的新值。

    null
List<String> func(List<String> old, Map<String, String> oldToNew)
{
    List<String> holger = old.stream()
                          .map(oldToNew::get)
                          .filter(Objects::nonNull)
                          .collect(Collectors.toList);

    if (holger.size() < old.size()) {
       // ... appropriate error handling code ... 
    }
    else {
       return holger;
    }
}

对更好的方法的建议?或者我应该把溪流全部挖开,用好的旧循环?

共有1个答案

郤瀚
2023-03-14

没有最好的解决方案,因为这在很大程度上取决于用例。例如。如果查找失败的可能性不大,或者错误处理意味着无论如何都要抛出异常,那么在映射函数中的第一次失败查找时抛出异常可能确实是一个不错的选择。那么,任何后续代码都不必关心错误条件。

另一种处理方法可能是:

List<String> func(List<String> old, Map<String, String> oldToNew) {
    Map<Boolean,List<String>> map=old.stream()
        .map(oldToNew::get)
        .collect(Collectors.partitioningBy(Objects::nonNull));
    List<String> failed=map.get(false);
    if(!failed.isEmpty())
        throw new IllegalStateException(failed.size()+" lookups failed");
    return map.get(true);
}

对于成功的情况,仍然可以认为这是优化的,因为它收集了一个包含null值的大多数无意义的列表,用于失败。但它的作用是能够告诉失败的数量(不像使用抛出映射函数)。

List<String> func(List<String> old, Map<String, String> oldToNew) {
    Map<Boolean,List<String>> map=old.stream()
        .map(s -> new AbstractMap.SimpleImmutableEntry<>(s, oldToNew.get(s)))
        .collect(Collectors.partitioningBy(e -> e.getValue()!=null,
            Collectors.mapping(e -> Optional.ofNullable(e.getValue()).orElse(e.getKey()),
                Collectors.toList())));
    List<String> failed=map.get(false);
    if(!failed.isEmpty())
        throw new IllegalStateException("The following key(s) failed: "+failed);
    return map.get(true);
}

它收集两个有意义的列表,其中包含失败查找的失败键和成功映射值的列表。请注意,这两个列表都可以返回。

 类似资料:
  • 我有以下两门课: : : 我希望进行流操作,以便: 将映射到中的 的和分别合并到和中,对于所有具有相同id的s 为此,我编写了以下一段代码: 它的工作和输出如下: 但我相信有一种更好的方式可以达到同样的效果。任何一个指针都很好。

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 有没有一种简单/快速的方法来检查地图中的元素是否使用流不同?我有这张地图:

  • 在查看几个不同的文档时,我只看到地图(ECMAScript6)键是布尔值、字符串或整数。有没有一种方法可以使用另一个定制的对象(用新的CustomObject(x, y)构造函数调用调用)作为键添加? 我可以添加一个对象作为密钥,但无法检查地图是否有所述对象。 有办法解决这个问题吗? https://developer.mozilla.org/en-US/docs/Web/JavaScript/R

  • 1)做这件事的正确方法是什么?我做错了什么? 2)流是线程安全的吗?我正在多线程环境中工作,所以我是否应该使用返回TRAAD安全集合的收集器?

  • 使用Java8流,当输入整数没有输出时,映射的最佳方法是什么? 简单地返回NULL?但现在我的输出列表大小将小于我的输入大小...