如果toList返回空列表,则收集器返回singletonList

use*_*882 10 java java-8 java-stream collectors

我有一个很大的流管道,因此希望保持清洁.我有以下部分更大的管道

Integer defaultInt;
//...
Stream<Integer> ints;
ints.filter(/* predicate_goes_here */).collect(toSingletonIfEmptyCollector);
Run Code Online (Sandbox Code Playgroud)

toSingletonIfEmptyCollector被认为是作用于同一Collectors.toList()的确,如果它返回非emtpy列表,Collections.singletonList(defaultInt)如果Collectors.toList()返回空.

是否有更短的方法来实现它(例如,通过组合JDK中提供的标准收集器)而不是Collector从头开始实现所有方法?

Tun*_*aki 16

您可以collectingAndThen在内置toList()收集器上使用并执行其他修整器操作,以便在没有元素的情况下返回单个列表.

static <T> Collector<T, ?, List<T>> toList(T defaultValue) {
    return Collectors.collectingAndThen(
              Collectors.toList(), 
              l -> l.isEmpty() ? Collections.singletonList(defaultValue) : l
           );
}
Run Code Online (Sandbox Code Playgroud)

它会像这样使用:

System.out.println(Stream.of(1, 2, 3).collect(toList(5))); // prints "[1, 2, 3]"
System.out.println(Stream.empty().collect(toList(5))); // prints "[5]"
Run Code Online (Sandbox Code Playgroud)

  • 我宁愿用更具体的东西命名自定义收集器,例如`toListOrDefault`,特别是它是静态的,会害怕与`Collectors.toList`混淆,特别是如果使用静态导入的话. (5认同)