如果要避免计算函数和两次,则必须存储结果。例如:func1
func2
stream.map(t -> new AbstractMap.SimpleImmutableEntry<>(func1(t), func2(t))
.filter(e -> e.getKey()!=null && e.getValue()!=null)
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
这不会使代码更短,甚至效率也取决于具体情况。如果评估的成本足够高,可以补偿临时对象的创建,则此更改是值得的。原则上,临时对象可以得到优化,但这并不能保证。func1
func2
从Java 9开始,你可以用Map.entry(...)替换
。由于此条目类型从一开始就不允许,因此在构造条目之前需要对其进行筛选:new AbstractMap.SimpleImmutableEntry<>(…)
null
stream.flatMap(t -> {
Type1 value1 = func1(t);
Type2 value2 = func2(t);
return value1!=null && value2!=null? Stream.of(Map.entry(value1, value2)): null;
})
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
或者,您可以使用您已经在使用的库之一的对类型(Java API本身不提供此类类型)。