首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >stream.count()导致NPE

stream.count()导致NPE
EN

Stack Overflow用户
提问于 2022-11-23 08:02:31
回答 5查看 56关注 0票数 2

我在中看到了一些奇怪的行为。这是我的密码:

代码语言:javascript
运行
复制
public static void main( String[] args ) {
    final List<String> list = Arrays.asList( "string1", "string2" );
    final Map<String, List<String>> map = new HashMap<>();
    map.put( "string1", Arrays.asList( "1" ) );
    //map.put( "string2", Arrays.asList( "1" ) );
    Stream<String> stream = list.stream().map( map::get ).flatMap( List::stream );
    System.out.println( "Stream=" + stream );
    long count = stream.count();
    System.out.println( "Stream count=" + count );
}

第二行(long count = stream.count();)将产生NPE。如果我添加另一个条目来映射键"string2“(注释代码),则不会出现异常。有人能指出为什么它会导致NPE而不只是将计数返回为1吗?

如果我尝试在列表中收集流的结果,而不是调用count(),则会观察到相同的行为

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2022-11-23 08:10:10

您的代码将在List#stream中调用flatMap中的null,这将导致NullPointerException。您需要在flatMap之前筛选出空值:

代码语言:javascript
运行
复制
list.stream()
        .map(map::get)
        .filter(Objects::nonNull)
        .flatMap(List::stream)
票数 2
EN

Stack Overflow用户

发布于 2022-11-23 08:10:04

当应用于流的第二个元素(“.map( map::get )”)时,.map( map::get )返回null。当.flatMap( List::stream )应用于该null元素时,您将得到NullPointerException,因为它尝试在空引用上执行stream()方法。

您应该过滤掉null元素以避免这种情况:

代码语言:javascript
运行
复制
Stream<String> stream = list.stream()
                            .map( map::get )
                            .filter(Objects::nonNull)
                            .flatMap( List::stream );
票数 1
EN

Stack Overflow用户

发布于 2022-11-23 08:14:34

如果映射中的键没有映射(如文档中所述),Map.get()将返回null

返回指定键映射到的值,如果此映射不包含键的映射,则返回null。

若要修复,请从流中筛选出空元素。

代码语言:javascript
运行
复制
Stream<String> stream = list.stream()
    .map(map::get)
    .filter(Objects::nonNull)
    .flatMap(Collection::stream);

或者可以使用Map.getOrDefault()提供默认值。

返回指定键映射到的值,如果此映射不包含键的映射,则返回defaultValue。

代码语言:javascript
运行
复制
Stream<String> stream = list.stream()
     .map(str -> map.getOrDefault(str, Collections.emptyList()))
     .flatMap(Collection::stream);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74543455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档