如果要避免计算函数和两次,则必须存储结果。例如:func1func2
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));
这不会使代码更短,甚至效率也取决于具体情况。如果评估的成本足够高,可以补偿临时对象的创建,则此更改是值得的。原则上,临时对象可以得到优化,但这并不能保证。func1func2
从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本身不提供此类类型)。