我在中看到了一些奇怪的行为。这是我的密码:
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()
,则会观察到相同的行为
发布于 2022-11-23 08:10:10
您的代码将在List#stream
中调用flatMap
中的null,这将导致NullPointerException。您需要在flatMap之前筛选出空值:
list.stream()
.map(map::get)
.filter(Objects::nonNull)
.flatMap(List::stream)
发布于 2022-11-23 08:10:04
当应用于流的第二个元素(“.map( map::get )
”)时,.map( map::get )
返回null
。当.flatMap( List::stream )
应用于该null
元素时,您将得到NullPointerException
,因为它尝试在空引用上执行stream()
方法。
您应该过滤掉null
元素以避免这种情况:
Stream<String> stream = list.stream()
.map( map::get )
.filter(Objects::nonNull)
.flatMap( List::stream );
发布于 2022-11-23 08:14:34
如果映射中的键没有映射(如文档中所述),Map.get()将返回null
。
返回指定键映射到的值,如果此映射不包含键的映射,则返回null。
若要修复,请从流中筛选出空元素。
Stream<String> stream = list.stream()
.map(map::get)
.filter(Objects::nonNull)
.flatMap(Collection::stream);
或者可以使用Map.getOrDefault()提供默认值。
返回指定键映射到的值,如果此映射不包含键的映射,则返回defaultValue。
Stream<String> stream = list.stream()
.map(str -> map.getOrDefault(str, Collections.emptyList()))
.flatMap(Collection::stream);
https://stackoverflow.com/questions/74543455
复制相似问题