2016-07-18 8 views
9

私はかなり大きなストリームパイプラインを持っているので、それをきれいに保ちたいと思います。私はtoSingletonIfEmptyCollectorは、それが非emtpyリストを返し、Collections.singletonList(defaultInt)Collectors.toList()場合は、空の返された場合Collectors.toList()が行うのと同じ役割を果たすことになって、より大きなパイプラインtoListが空のリストを返した場合にsingletonListを返すコレクタ

Integer defaultInt; 
//... 
Stream<Integer> ints; 
ints.filter(/* predicate_goes_here */).collect(toSingletonIfEmptyCollector); 

の以下の部分を持っています。

Collectorのメソッドをゼロから実装するのではなく、実装する方法がより短くありますか(たとえば、JDKで提供される標準のコレクタを作成するなど)。

+2

。 –

+1

'Stream 'で 'IntStream'で有用なヘルパーメソッドがたくさんあります。 **注:** 'IntStream'はプリミティブストリーム*(ちょっとしたヒント) –

答えて

15

collectingAndThenを使用して、組み込みのtoList()コレクタに対して追加のフィニッシャ操作を実行して、要素がない場合にシングルトンリストを返すことができます。

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

このように使用されるでしょう:私はあなたが結果の一覧を変異していないと仮定し

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]" 
+0

偉大な、まさに私が欲しかったことです、ありがとうございます。 – user3663882

+3

私はカスタムのコレクタに 'toListOrDefault'などの特別な名前を付けることをお勧めします。これは静的であること、特に静的なインポートが使用される場合は特に' Collectors.toList'との混乱を招く恐れがあります。 –

関連する問題