public final class Collectors extends Object
Collector
実装。
定義済のコレクタを使って一般的な可変リダクション・タスクを実行する例を、次に示します。
// Accumulate names into a List
List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());
// Accumulate names into a TreeSet
Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
// Convert elements to strings and concatenate them, separated by commas
String joined = things.stream()
.map(Object::toString)
.collect(Collectors.joining(", "));
// Compute sum of salaries of employee
int total = employees.stream()
.collect(Collectors.summingInt(Employee::getSalary)));
// Group employees by department
Map<Department, List<Employee>> byDept
= employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
// Compute sum of salaries by department
Map<Department, Integer> totalByDept
= employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment,
Collectors.summingInt(Employee::getSalary)));
// Partition students into passing and failing
Map<Boolean, List<Student>> passingFailing =
students.stream()
.collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));
修飾子と型 | メソッドと説明 |
---|---|
static <T> Collector<T,?,Double> |
averagingDouble(ToDoubleFunction<? super T> mapper)
入力要素にdouble値関数を適用した結果の算術平均を生成する
Collector を返します。 |
static <T> Collector<T,?,Double> |
averagingInt(ToIntFunction<? super T> mapper)
入力要素にint値関数を適用した結果の算術平均を生成する
Collector を返します。 |
static <T> Collector<T,?,Double> |
averagingLong(ToLongFunction<? super T> mapper)
入力要素にlong値関数を適用した結果の算術平均を生成する
Collector を返します。 |
static <T,A,R,RR> Collector<T,A,RR> |
collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)
追加の仕上げ変換が実行されるように
Collector を適応させます。 |
static <T> Collector<T,?,Long> |
counting()
T 型の要素を受け取って入力要素の数をカウントするCollector を返します。 |
static <T,K> Collector<T,?,Map<K,List<T>>> |
groupingBy(Function<? super T,? extends K> classifier)
分類関数に従って要素をグループ化し、結果を
Map に格納して返す、T 型の入力要素に対する「グループ化」操作を実装したCollector を返します。 |
static <T,K,A,D> Collector<T,?,Map<K,D>> |
groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
分類関数に従って要素をグループ化した後、指定された下流
Collector を使って特定のキーに関連付けられた値のリダクション操作を実行する、T 型の入力要素に対するカスケード「グループ化」操作を実装したCollector を返します。 |
static <T,K,D,A,M extends Map<K,D>> |
groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
分類関数に従って要素をグループ化した後、指定された下流
Collector を使って特定のキーに関連付けられた値のリダクション操作を実行する、T 型の入力要素に対するカスケード「グループ化」操作を実装したCollector を返します。 |
static <T,K> Collector<T,?,ConcurrentMap<K,List<T>>> |
groupingByConcurrent(Function<? super T,? extends K> classifier)
分類関数に従って要素をグループ化する、
T 型の入力要素に対する「グループ化」操作を実装した並行Collector を返します。 |
static <T,K,A,D> Collector<T,?,ConcurrentMap<K,D>> |
groupingByConcurrent(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
分類関数に従って要素をグループ化した後、指定された下流
Collector を使って特定のキーに関連付けられた値のリダクション操作を実行する、T 型の入力要素に対するカスケード「グループ化」操作を実装した並行Collector を返します。 |
static <T,K,A,D,M extends ConcurrentMap<K,D>> |
groupingByConcurrent(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
分類関数に従って要素をグループ化した後、指定された下流
Collector を使って特定のキーに関連付けられた値のリダクション操作を実行する、T 型の入力要素に対するカスケード「グループ化」操作を実装した並行Collector を返します。 |
static Collector<CharSequence,?,String> |
joining()
入力要素を検出順に連結して1つの
String にするCollector を返します。 |
static Collector<CharSequence,?,String> |
joining(CharSequence delimiter)
入力要素を検出順に指定された区切り文字で区切りながら連結する
Collector を返します。 |
static Collector<CharSequence,?,String> |
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
入力要素を検出順に指定された区切り文字で区切りながら連結し、指定された接頭辞と接尾辞を付加する
Collector を返します。 |
static <T,U,A,R> Collector<T,?,R> |
mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
U 型の要素を受け取るCollector がT 型の要素を受け取れるように適応させるため、各入力要素にマッピング関数を適用した後で蓄積を行うようにします。 |
static <T> Collector<T,?,Optional<T>> |
maxBy(Comparator<? super T> comparator)
指定された
Comparator に従ってOptional<T> として記述された最大要素を生成するCollector を返します。 |
static <T> Collector<T,?,Optional<T>> |
minBy(Comparator<? super T> comparator)
指定された
Comparator に従ってOptional<T> として記述された最小要素を生成するCollector を返します。 |
static <T> Collector<T,?,Map<Boolean,List<T>>> |
partitioningBy(Predicate<? super T> predicate)
Predicate に従って入力要素を分割し、結果をMap<Boolean, List<T>> 内に格納するCollector を返します。 |
static <T,D,A> Collector<T,?,Map<Boolean,D>> |
partitioningBy(Predicate<? super T> predicate, Collector<? super T,A,D> downstream)
Predicate に従って入力要素を分割し、別のCollector に従って各パーティションの値をリデュースし、結果をMap<Boolean, D> 内に格納するCollector を返します(下流のリダクションの結果がマップの値になる)。 |
static <T> Collector<T,?,Optional<T>> |
reducing(BinaryOperator<T> op)
指定された
BinaryOperator の下で入力要素のリダクションを実行するCollector を返します。 |
static <T> Collector<T,?,T> |
reducing(T identity, BinaryOperator<T> op)
指定された
BinaryOperator の下で指定された単位元を使って入力要素のリダクションを実行するCollector を返します。 |
static <T,U> Collector<T,?,U> |
reducing(U identity, Function<? super T,? extends U> mapper, BinaryOperator<U> op)
指定されたマッピング関数と
BinaryOperator の下で入力要素のリダクションを実行するCollector を返します。 |
static <T> Collector<T,?,DoubleSummaryStatistics> |
summarizingDouble(ToDoubleFunction<? super T> mapper)
各入力要素に
double 生成マッピング関数を適用し、その結果の値のサマリー統計を返すCollector を返します。 |
static <T> Collector<T,?,IntSummaryStatistics> |
summarizingInt(ToIntFunction<? super T> mapper)
各入力要素に
int 生成マッピング関数を適用し、その結果の値のサマリー統計を返すCollector を返します。 |
static <T> Collector<T,?,LongSummaryStatistics> |
summarizingLong(ToLongFunction<? super T> mapper)
各入力要素に
long 生成マッピング関数を適用し、その結果の値のサマリー統計を返すCollector を返します。 |
static <T> Collector<T,?,Double> |
summingDouble(ToDoubleFunction<? super T> mapper)
入力要素にdouble値関数を適用した結果の合計を生成する
Collector を返します。 |
static <T> Collector<T,?,Integer> |
summingInt(ToIntFunction<? super T> mapper)
入力要素にint値関数を適用した結果の合計を生成する
Collector を返します。 |
static <T> Collector<T,?,Long> |
summingLong(ToLongFunction<? super T> mapper)
入力要素にlong値関数を適用した結果の合計を生成する
Collector を返します。 |
static <T,C extends Collection<T>> |
toCollection(Supplier<C> collectionFactory)
入力要素を検出順に新しい
Collection 内に蓄積するCollector を返します。 |
static <T,K,U> Collector<T,?,ConcurrentMap<K,U>> |
toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
ConcurrentMap 内に要素を累積する並行Collector を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。 |
static <T,K,U> Collector<T,?,ConcurrentMap<K,U>> |
toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
ConcurrentMap 内に要素を累積する並行Collector を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。 |
static <T,K,U,M extends ConcurrentMap<K,U>> |
toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
ConcurrentMap 内に要素を累積する並行Collector を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。 |
static <T> Collector<T,?,List<T>> |
toList()
入力要素を新しい
List に蓄積するCollector を返します。 |
static <T,K,U> Collector<T,?,Map<K,U>> |
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
Map 内に要素を累積するCollector を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。 |
static <T,K,U> Collector<T,?,Map<K,U>> |
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
Map 内に要素を累積するCollector を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。 |
static <T,K,U,M extends Map<K,U>> |
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
Map 内に要素を累積するCollector を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。 |
static <T> Collector<T,?,Set<T>> |
toSet()
入力要素を新しい
Set に蓄積するCollector を返します。 |
public static <T,C extends Collection<T>> Collector<T,?,C> toCollection(Supplier<C> collectionFactory)
Collection
内に蓄積するCollector
を返します。Collection
は指定されたファクトリによって作成されます。T
- 入力要素の型C
- 結果となるCollection
の型collectionFactory
- 適切な型の新しい空のCollection
を返すSupplier
Collection
内に集めるCollector
public static <T> Collector<T,?,List<T>> toList()
List
に蓄積するCollector
を返します。返されるList
の型、可変性、直列化可能性、またはスレッド安全性は一切保証されません。返されるList
をより細かく制御する必要がある場合は、toCollection(Supplier)
を使用してください。T
- 入力要素の型List
内に集めるCollector
public static <T> Collector<T,?,Set<T>> toSet()
Set
に蓄積するCollector
を返します。返されるSet
の型、可変性、直列化可能性、またはスレッド安全性は一切保証されません。返されるSet
をより細かく制御する必要がある場合は、toCollection(Supplier)
を使用してください。
これは、順序付けされていない
Collectorです。
T
- 入力要素の型Set
内に集めるCollector
public static Collector<CharSequence,?,String> joining()
String
にするCollector
を返します。String
にするCollector
public static Collector<CharSequence,?,String> joining(CharSequence delimiter)
Collector
を返します。delimiter
- 各要素間で使用される区切り文字Collector
public static Collector<CharSequence,?,String> joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
Collector
を返します。delimiter
- 各要素間で使用される区切り文字prefix
- 連結結果の先頭で使用される文字シーケンスsuffix
- 連結結果の末尾で使用される文字シーケンスCollector
public static <T,U,A,R> Collector<T,?,R> mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
U
型の要素を受け取るCollector
がT
型の要素を受け取れるように適応させるため、各入力要素にマッピング関数を適用した後で蓄積を行うようにします。mapping()
コレクタがもっとも役に立つのは、複数レベルのリダクション(groupingBy
またはpartitioningBy
の下流など)で使用する場合です。たとえば、特定のPerson
ストリームについて、市町村ごとに名前のセットを蓄積するには、次のようにします。
Map<City, Set<String>> lastNamesByCity
= people.stream().collect(groupingBy(Person::getCity,
mapping(Person::getLastName, toSet())));
T
- 入力要素の型U
- 下流コレクタが受け取る要素の型A
- 下流コレクタの中間蓄積の型R
- コレクタの結果の型mapper
- 入力要素に適用される関数downstream
- マップ後の値を受け取るコレクタpublic static <T,A,R,RR> Collector<T,A,RR> collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)
Collector
を適応させます。たとえば次のように、常に不変リストが生成されるようにtoList()
コレクタを適応させることができます。
List<String> people
= people.stream().collect(collectingAndThen(toList(), Collections::unmodifiableList));
T
- 入力要素の型A
- 下流コレクタの中間蓄積の型R
- 下流コレクタの結果の型RR
- 結果となるコレクタの結果の型downstream
- コレクタfinisher
- 下流コレクタの最終結果に適用される関数public static <T> Collector<T,?,Long> counting()
T
型の要素を受け取って入力要素の数をカウントするCollector
を返します。要素が存在しない場合、結果は0になります。
reducing(0L, e -> 1L, Long::sum)
T
- 入力要素の型Collector
public static <T> Collector<T,?,Optional<T>> minBy(Comparator<? super T> comparator)
Comparator
に従ってOptional<T>
として記述された最小要素を生成するCollector
を返します。
reducing(BinaryOperator.minBy(comparator))
T
- 入力要素の型comparator
- 要素を比較するためのComparator
Collector
public static <T> Collector<T,?,Optional<T>> maxBy(Comparator<? super T> comparator)
Comparator
に従ってOptional<T>
として記述された最大要素を生成するCollector
を返します。
reducing(BinaryOperator.maxBy(comparator))
T
- 入力要素の型comparator
- 要素を比較するためのComparator
Collector
public static <T> Collector<T,?,Integer> summingInt(ToIntFunction<? super T> mapper)
Collector
を返します。要素が存在しない場合、結果は0になります。T
- 入力要素の型mapper
- 合計の対象となるプロパティーを抽出する関数Collector
public static <T> Collector<T,?,Long> summingLong(ToLongFunction<? super T> mapper)
Collector
を返します。要素が存在しない場合、結果は0になります。T
- 入力要素の型mapper
- 合計の対象となるプロパティーを抽出する関数Collector
public static <T> Collector<T,?,Double> summingDouble(ToDoubleFunction<? super T> mapper)
Collector
を返します。要素が存在しない場合、結果は0になります。
値が記録されている順番によって、返される合計が変わる可能性がありますが、これは、異なる大きさの値同士を加算したときの丸め誤差が累積されるからです。値を大きさの絶対値の昇順にソートすると、結果の精度が改善される傾向があります。記録された値の中にNaN
のものが存在しているか、合計がある時点でNaN
に達した場合、合計はNaN
になります。
T
- 入力要素の型mapper
- 合計の対象となるプロパティーを抽出する関数Collector
public static <T> Collector<T,?,Double> averagingInt(ToIntFunction<? super T> mapper)
Collector
を返します。要素が存在しない場合、結果は0になります。T
- 入力要素の型mapper
- 合計の対象となるプロパティーを抽出する関数Collector
public static <T> Collector<T,?,Double> averagingLong(ToLongFunction<? super T> mapper)
Collector
を返します。要素が存在しない場合、結果は0になります。T
- 入力要素の型mapper
- 合計の対象となるプロパティーを抽出する関数Collector
public static <T> Collector<T,?,Double> averagingDouble(ToDoubleFunction<? super T> mapper)
Collector
を返します。要素が存在しない場合、結果は0になります。
値が記録されている順番によって、返される平均が変わる可能性がありますが、これは、異なる大きさの値同士を加算したときの丸め誤差が累積されるからです。値を大きさの絶対値の昇順にソートすると、結果の精度が改善される傾向があります。記録された値の中にNaN
のものが存在しているか、合計がある時点でNaN
に達した場合、平均はNaN
になります。
double
フォーマットは、-253から253の範囲のすべての連続する整数を表現できます。パイプラインに含まれる値の数が253個を超える場合、平均計算の除数が253で飽和するため、さらなる数値誤差が発生します。T
- 入力要素の型mapper
- 合計の対象となるプロパティーを抽出する関数Collector
public static <T> Collector<T,?,T> reducing(T identity, BinaryOperator<T> op)
BinaryOperator
の下で指定された単位元を使って入力要素のリダクションを実行するCollector
を返します。reducing()
コレクタがもっとも役に立つのは、複数レベルのリダクション(groupingBy
またはpartitioningBy
の下流)で使用する場合です。ストリームに対して単純なリダクションを実行する場合は、代わりにStream.reduce(Object, BinaryOperator)
を使用してください。T
- リダクションの入力と出力の要素の型identity
- リダクションの単位元の値(入力要素が存在しない場合の戻り値でもある)op
- 入力要素のリデュースに使用されるBinaryOperator<T>
Collector
reducing(BinaryOperator)
, reducing(Object, Function, BinaryOperator)
public static <T> Collector<T,?,Optional<T>> reducing(BinaryOperator<T> op)
BinaryOperator
の下で入力要素のリダクションを実行するCollector
を返します。結果はOptional<T>
として記述されます。reducing()
コレクタがもっとも役に立つのは、複数レベルのリダクション(groupingBy
またはpartitioningBy
の下流)で使用する場合です。単純なリダクションをストリームに対して実行する場合は、代わりにStream.reduce(BinaryOperator)
を使用してください。
たとえば、特定のPerson
ストリームについて、市町村ごとに身長のもっとも高い人を計算するには、次のようにします。
Comparator<Person> byHeight = Comparator.comparing(Person::getHeight);
Map<City, Person> tallestByCity
= people.stream().collect(groupingBy(Person::getCity, reducing(BinaryOperator.maxBy(byHeight))));
T
- リダクションの入力と出力の要素の型op
- 入力要素のリデュースに使用されるBinaryOperator<T>
Collector
reducing(Object, BinaryOperator)
, reducing(Object, Function, BinaryOperator)
public static <T,U> Collector<T,?,U> reducing(U identity, Function<? super T,? extends U> mapper, BinaryOperator<U> op)
BinaryOperator
の下で入力要素のリダクションを実行するCollector
を返します。これはreducing(Object, BinaryOperator)
を一般化したものであり、リダクションの前の要素の変換を可能にします。reducing()
コレクタがもっとも役に立つのは、複数レベルのリダクション(groupingBy
またはpartitioningBy
の下流)で使用する場合です。単純なマップ-リデュースをストリームに対して実行する場合は、代わりにStream.map(Function)
とStream.reduce(Object, BinaryOperator)
を使用してください。
たとえば、特定のPerson
ストリームについて、市町村ごとに住民の最長の名前を計算するには、次のようにします。
Comparator<String> byLength = Comparator.comparing(String::length);
Map<City, String> longestLastNameByCity
= people.stream().collect(groupingBy(Person::getCity,
reducing(Person::getLastName, BinaryOperator.maxBy(byLength))));
T
- 入力要素の型U
- マップ後の値の型identity
- リダクションの単位元の値(入力要素が存在しない場合の戻り値でもある)mapper
- 各入力値に適用するマッピング関数op
- マップされた値のリデュースに使用されるBinaryOperator<U>
Collector
reducing(Object, BinaryOperator)
, reducing(BinaryOperator)
public static <T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier)
Map
に格納して返す、T
型の入力要素に対する「グループ化」操作を実装したCollector
を返します。
分類関数は、要素をあるキーの型K
にマップします。コレクタによって生成されるMap<K, List<T>>
のキーは、入力要素に分類関数を適用した結果の値であり、対応する値は、分類関数の下で関連キーにマップされた入力要素を含むList
になります。
返されるMap
またはList
オブジェクトの型、可変性、直列化可能性、またはスレッド安全性は一切保証されません。
groupingBy(classifier, toList());
Collector
は並行ではありません。並列ストリーム・パイプラインでは、combiner
関数はあるマップのキーを別のマップにマージすることにより動作しますが、この操作はコストが非常に高くなる可能性があります。結果のMap
コレクタで要素の出現順序を維持する必要がない場合、groupingByConcurrent(Function)
を使用することで並列処理のパフォーマンスが改善される可能性があります。T
- 入力要素の型K
- キーの型classifier
- 入力要素をキーにマップする分類関数Collector
groupingBy(Function, Collector)
, groupingBy(Function, Supplier, Collector)
, groupingByConcurrent(Function)
public static <T,K,A,D> Collector<T,?,Map<K,D>> groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
Collector
を使って特定のキーに関連付けられた値のリダクション操作を実行する、T
型の入力要素に対するカスケード「グループ化」操作を実装したCollector
を返します。
分類関数は、要素をあるキーの型K
にマップします。下流コレクタは、T
型の要素に作用してD
型の結果を生成します。結果となるコレクタは、Map<K, D>
を生成します。
返されるMap
の型、可変性、直列化可能性、またはスレッド安全性は一切保証されません。
たとえば、市町村ごとの人の名前のセットを計算するには、次のようにします。
Map<City, Set<String>> namesByCity
= people.stream().collect(groupingBy(Person::getCity,
mapping(Person::getLastName, toSet())));
Collector
は並行ではありません。並列ストリーム・パイプラインでは、combiner
関数はあるマップのキーを別のマップにマージすることにより動作しますが、この操作はコストが非常に高くなる可能性があります。下流コレクタに要素が提供される順序を維持する必要がない場合、groupingByConcurrent(Function, Collector)
を使用することで並列処理のパフォーマンスが改善される可能性があります。T
- 入力要素の型K
- キーの型A
- 下流コレクタの中間蓄積の型D
- 下流リダクションの結果の型classifier
- 入力要素をキーにマップする分類関数downstream
- 下流リダクションを実装したCollector
Collector
groupingBy(Function)
, groupingBy(Function, Supplier, Collector)
, groupingByConcurrent(Function, Collector)
public static <T,K,D,A,M extends Map<K,D>> Collector<T,?,M> groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
Collector
を使って特定のキーに関連付けられた値のリダクション操作を実行する、T
型の入力要素に対するカスケード「グループ化」操作を実装したCollector
を返します。このCollectorで生成されるMap
は、指定されたファクトリ関数によって作成されます。
分類関数は、要素をあるキーの型K
にマップします。下流コレクタは、T
型の要素に作用してD
型の結果を生成します。結果となるコレクタは、Map<K, D>
を生成します。
たとえば、市町村ごとの人の名前のセット(市町村名がソートされる)を計算するには、次のようにします。
Map<City, Set<String>> namesByCity
= people.stream().collect(groupingBy(Person::getCity, TreeMap::new,
mapping(Person::getLastName, toSet())));
Collector
は並行ではありません。並列ストリーム・パイプラインでは、combiner
関数はあるマップのキーを別のマップにマージすることにより動作しますが、この操作はコストが非常に高くなる可能性があります。下流コレクタに要素が提供される順序を維持する必要がない場合、groupingByConcurrent(Function, Supplier, Collector)
を使用することで並列処理のパフォーマンスが改善される可能性があります。T
- 入力要素の型K
- キーの型A
- 下流コレクタの中間蓄積の型D
- 下流リダクションの結果の型M
- 結果となるMap
の型classifier
- 入力要素をキーにマップする分類関数downstream
- 下流リダクションを実装したCollector
mapFactory
- 呼出し時に、要求された型の新しい空のMap
を生成する関数Collector
groupingBy(Function, Collector)
, groupingBy(Function)
, groupingByConcurrent(Function, Supplier, Collector)
public static <T,K> Collector<T,?,ConcurrentMap<K,List<T>>> groupingByConcurrent(Function<? super T,? extends K> classifier)
T
型の入力要素に対する「グループ化」操作を実装した並行Collector
を返します。
これは、順序付けされていない
並行な
Collectorです。
分類関数は、要素をあるキーの型K
にマップします。コレクタによって生成されるConcurrentMap<K, List<T>>
のキーは、入力要素に分類関数を適用した結果の値であり、対応する値は、分類関数の下で関連キーにマップされた入力要素を含むList
になります。
返されるMap
またはList
オブジェクトの型、可変性、または直列化可能性、あるいは返されるList
オブジェクトのスレッド安全性は、一切保証されません。
groupingByConcurrent(classifier, toList());
T
- 入力要素の型K
- キーの型classifier
- 入力要素をキーにマップする分類関数Collector
groupingBy(Function)
, groupingByConcurrent(Function, Collector)
, groupingByConcurrent(Function, Supplier, Collector)
public static <T,K,A,D> Collector<T,?,ConcurrentMap<K,D>> groupingByConcurrent(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
Collector
を使って特定のキーに関連付けられた値のリダクション操作を実行する、T
型の入力要素に対するカスケード「グループ化」操作を実装した並行Collector
を返します。
これは、順序付けされていない
並行な
Collectorです。
分類関数は、要素をあるキーの型K
にマップします。下流コレクタは、T
型の要素に作用してD
型の結果を生成します。結果となるコレクタは、Map<K, D>
を生成します。
たとえば、市町村ごとの人の名前のセット(市町村名がソートされる)を計算するには、次のようにします。
ConcurrentMap<City, Set<String>> namesByCity
= people.stream().collect(groupingByConcurrent(Person::getCity,
mapping(Person::getLastName, toSet())));
T
- 入力要素の型K
- キーの型A
- 下流コレクタの中間蓄積の型D
- 下流リダクションの結果の型classifier
- 入力要素をキーにマップする分類関数downstream
- 下流リダクションを実装したCollector
Collector
groupingBy(Function, Collector)
, groupingByConcurrent(Function)
, groupingByConcurrent(Function, Supplier, Collector)
public static <T,K,A,D,M extends ConcurrentMap<K,D>> Collector<T,?,M> groupingByConcurrent(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
Collector
を使って特定のキーに関連付けられた値のリダクション操作を実行する、T
型の入力要素に対するカスケード「グループ化」操作を実装した並行Collector
を返します。このCollectorで生成されるConcurrentMap
は、指定されたファクトリ関数によって作成されます。
これは、順序付けされていない
並行な
Collectorです。
分類関数は、要素をあるキーの型K
にマップします。下流コレクタは、T
型の要素に作用してD
型の結果を生成します。結果となるコレクタは、Map<K, D>
を生成します。
たとえば、市町村ごとの人の名前のセット(市町村名がソートされる)を計算するには、次のようにします。
ConcurrentMap<City, Set<String>> namesByCity
= people.stream().collect(groupingBy(Person::getCity, ConcurrentSkipListMap::new,
mapping(Person::getLastName, toSet())));
T
- 入力要素の型K
- キーの型A
- 下流コレクタの中間蓄積の型D
- 下流リダクションの結果の型M
- 結果となるConcurrentMap
の型classifier
- 入力要素をキーにマップする分類関数downstream
- 下流リダクションを実装したCollector
mapFactory
- 呼出し時に、要求された型の新しい空のConcurrentMap
を生成する関数Collector
groupingByConcurrent(Function)
, groupingByConcurrent(Function, Collector)
, groupingBy(Function, Supplier, Collector)
public static <T> Collector<T,?,Map<Boolean,List<T>>> partitioningBy(Predicate<? super T> predicate)
Predicate
に従って入力要素を分割し、結果をMap<Boolean, List<T>>
内に格納するCollector
を返します。返されるMap
の型、可変性、直列化可能性、またはスレッド安全性は一切保証されません。T
- 入力要素の型predicate
- 入力要素の分類に使用される述語Collector
partitioningBy(Predicate, Collector)
public static <T,D,A> Collector<T,?,Map<Boolean,D>> partitioningBy(Predicate<? super T> predicate, Collector<? super T,A,D> downstream)
Predicate
に従って入力要素を分割し、別のCollector
に従って各パーティションの値をリデュースし、結果をMap<Boolean, D>
内に格納するCollector
を返します(下流のリダクションの結果がマップの値になる)。
返されるMap
の型、可変性、直列化可能性、またはスレッド安全性は一切保証されません。
T
- 入力要素の型A
- 下流コレクタの中間蓄積の型D
- 下流リダクションの結果の型predicate
- 入力要素の分類に使用される述語downstream
- 下流リダクションを実装したCollector
Collector
partitioningBy(Predicate)
public static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
Map
内に要素を累積するCollector
を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。
マップ先のキーが重複する場合(Object.equals(Object)
で判定)、コレクション操作の実行時にIllegalStateException
がスローされます。マップ先のキーが重複する可能性がある場合は、代わりにtoMap(Function, Function, BinaryOperator)
を使用してください。
Function.identity()
が役立つ可能性があります。たとえば次の場合、生徒を各自の成績評定平均値にマッピングするMap
が生成されます。
Map<Student, Double> studentToGPA
students.stream().collect(toMap(Functions.identity(),
student -> computeGPA(student)));
また次の場合、一意の識別子を生徒にマッピングするMap
が生成されます。
Map<String, Student> studentIdToStudent
students.stream().collect(toMap(Student::getId,
Functions.identity());
Collector
は並行ではありません。並列ストリーム・パイプラインでは、combiner
関数はあるマップのキーを別のマップにマージすることにより動作しますが、この操作はコストが非常に高くなる可能性があります。結果を検出順でMap
に挿入する必要がない場合は、toConcurrentMap(Function, Function)
を使用することで並列処理のパフォーマンスが改善される可能性があります。T
- 入力要素の型K
- キー・マッピング関数の出力の型U
- 値マッピング関数の出力の型keyMapper
- キーを生成するマッピング関数valueMapper
- 値を生成するマッピング関数Map
内に要素を集めるCollector
(マップのキーと値は、入力要素にマッピング関数を適用した結果となる)toMap(Function, Function, BinaryOperator)
, toMap(Function, Function, BinaryOperator, Supplier)
, toConcurrentMap(Function, Function)
public static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
Map
内に要素を累積するCollector
を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。
マップ先のキーが重複している場合(Object.equals(Object)
で判定)、等しい各要素に値マッピング関数が適用され、それらの結果が指定されたマージ関数を使ってマージされます。
toMap
ではただ無条件にスローを行うマージ関数が使用されますが、より柔軟なマージポリシーを簡単に記述できます。たとえば、あるPerson
ストリームがあるとして、名前と住所を対応づける電話帳を生成したいが、同じ名前の人が複数存在する可能性がある場合、次のようにすれば、そうした衝突を適切に処理し、名前を連結された住所リストにマッピングするMap
を生成することができます。
Map<String, String> phoneBook
people.stream().collect(toMap(Person::getName,
Person::getAddress,
(s, a) -> s + ", " + a));
Collector
は並行ではありません。並列ストリーム・パイプラインでは、combiner
関数はあるマップのキーを別のマップにマージすることにより動作しますが、この操作はコストが非常に高くなる可能性があります。結果を検出順でMap
にマージする必要がない場合は、toConcurrentMap(Function, Function, BinaryOperator)
を使用することで並列処理のパフォーマンスが改善される可能性があります。T
- 入力要素の型K
- キー・マッピング関数の出力の型U
- 値マッピング関数の出力の型keyMapper
- キーを生成するマッピング関数valueMapper
- 値を生成するマッピング関数mergeFunction
- 同じキーに関連付けられた値同士の衝突の解決に使用されるマージ関数(Map.merge(Object, Object, BiFunction)
に渡される)Map
内に要素を集めるCollector
(マップのキーは、入力要素にキー・マッピング関数を適用した結果であり、マップの値は、そのキーに等しいすべての入力要素に値マッピング関数を適用し、それらをマージ関数で結合した結果となる)toMap(Function, Function)
, toMap(Function, Function, BinaryOperator, Supplier)
, toConcurrentMap(Function, Function, BinaryOperator)
public static <T,K,U,M extends Map<K,U>> Collector<T,?,M> toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
Map
内に要素を累積するCollector
を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。
マップ先のキーが重複している場合(Object.equals(Object)
で判定)、等しい各要素に値マッピング関数が適用され、それらの結果が指定されたマージ関数を使ってマージされます。Map
は、指定されたサプライヤ関数によって作成されます。
Collector
は並行ではありません。並列ストリーム・パイプラインでは、combiner
関数はあるマップのキーを別のマップにマージすることにより動作しますが、この操作はコストが非常に高くなる可能性があります。結果を検出順でMap
にマージする必要がない場合は、toConcurrentMap(Function, Function, BinaryOperator, Supplier)
を使用することで並列処理のパフォーマンスが改善される可能性があります。T
- 入力要素の型K
- キー・マッピング関数の出力の型U
- 値マッピング関数の出力の型M
- 結果となるMap
の型keyMapper
- キーを生成するマッピング関数valueMapper
- 値を生成するマッピング関数mergeFunction
- 同じキーに関連付けられた値同士の衝突の解決に使用されるマージ関数(Map.merge(Object, Object, BiFunction)
に渡される)mapSupplier
- 結果の挿入先となる新しい空のMap
を返す関数Map
内に要素を集めるCollector
(マップのキーは、入力要素にキー・マッピング関数を適用した結果であり、マップの値は、そのキーに等しいすべての入力要素に値マッピング関数を適用し、それらをマージ関数で結合した結果となる)toMap(Function, Function)
, toMap(Function, Function, BinaryOperator)
, toConcurrentMap(Function, Function, BinaryOperator, Supplier)
public static <T,K,U> Collector<T,?,ConcurrentMap<K,U>> toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
ConcurrentMap
内に要素を累積する並行Collector
を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。
マップ先のキーが重複する場合(Object.equals(Object)
で判定)、コレクション操作の実行時にIllegalStateException
がスローされます。マップ先のキーが重複する可能性がある場合は、代わりにtoConcurrentMap(Function, Function, BinaryOperator)
を使用してください。
Function.identity()
が役立つ可能性があります。たとえば次の場合、生徒を各自の成績評定平均値にマッピングするMap
が生成されます。
Map<Student, Double> studentToGPA
students.stream().collect(toMap(Functions.identity(),
student -> computeGPA(student)));
また次の場合、一意の識別子を生徒にマッピングするMap
が生成されます。
Map<String, Student> studentIdToStudent
students.stream().collect(toConcurrentMap(Student::getId,
Functions.identity());
これは、順序付けされていない
並行な
Collectorです。
T
- 入力要素の型K
- キー・マッピング関数の出力の型U
- 値マッピング関数の出力の型keyMapper
- キーを生成するマッピング関数valueMapper
- 値を生成するマッピング関数ConcurrentMap
内に要素を集める、順序付けされていない並行なCollector
(マップのキーは、入力要素にキー・マッピング関数を適用した結果であり、マップの値は、入力要素に値マッピング関数を適用した結果となる)toMap(Function, Function)
, toConcurrentMap(Function, Function, BinaryOperator)
, toConcurrentMap(Function, Function, BinaryOperator, Supplier)
public static <T,K,U> Collector<T,?,ConcurrentMap<K,U>> toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
ConcurrentMap
内に要素を累積する並行Collector
を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。
マップ先のキーが重複している場合(Object.equals(Object)
で判定)、等しい各要素に値マッピング関数が適用され、それらの結果が指定されたマージ関数を使ってマージされます。
toConcurrentMap
ではただ無条件にスローを行うマージ関数が使用されますが、より柔軟なマージ・ポリシーを簡単に記述できます。たとえば、あるPerson
ストリームがあるとして、名前と住所を対応づける電話帳を生成したいが、同じ名前の人が複数存在する可能性がある場合、次のようにすれば、そうした衝突を適切に処理し、名前を連結された住所リストにマッピングするMap
を生成することができます。
Map<String, String> phoneBook
people.stream().collect(toConcurrentMap(Person::getName,
Person::getAddress,
(s, a) -> s + ", " + a));
これは、順序付けされていない
並行な
Collectorです。
T
- 入力要素の型K
- キー・マッピング関数の出力の型U
- 値マッピング関数の出力の型keyMapper
- キーを生成するマッピング関数valueMapper
- 値を生成するマッピング関数mergeFunction
- 同じキーに関連付けられた値同士の衝突の解決に使用されるマージ関数(Map.merge(Object, Object, BiFunction)
に渡される)ConcurrentMap
内に要素を集める、順序付けされていない並行なCollector
(マップのキーは、入力要素にキー・マッピング関数を適用した結果であり、マップの値は、そのキーに等しいすべての入力要素に値マッピング関数を適用し、それらをマージ関数で結合した結果となる)toConcurrentMap(Function, Function)
, toConcurrentMap(Function, Function, BinaryOperator, Supplier)
, toMap(Function, Function, BinaryOperator)
public static <T,K,U,M extends ConcurrentMap<K,U>> Collector<T,?,M> toConcurrentMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
ConcurrentMap
内に要素を累積する並行Collector
を返します(指定されたマッピング関数を入力要素に適用した結果が、マップのキーと値になる)。
マップ先のキーが重複している場合(Object.equals(Object)
で判定)、等しい各要素に値マッピング関数が適用され、それらの結果が指定されたマージ関数を使ってマージされます。ConcurrentMap
は、指定されたサプライヤ関数によって作成されます。
これは、順序付けされていない
並行な
Collectorです。
T
- 入力要素の型K
- キー・マッピング関数の出力の型U
- 値マッピング関数の出力の型M
- 結果となるConcurrentMap
の型keyMapper
- キーを生成するマッピング関数valueMapper
- 値を生成するマッピング関数mergeFunction
- 同じキーに関連付けられた値同士の衝突の解決に使用されるマージ関数(Map.merge(Object, Object, BiFunction)
に渡される)mapSupplier
- 結果の挿入先となる新しい空のMap
を返す関数ConcurrentMap
内に要素を集める、順序付けされていない並行なCollector
(マップのキーは、入力要素にキー・マッピング関数を適用した結果であり、マップの値は、そのキーに等しいすべての入力要素に値マッピング関数を適用し、それらをマージ関数で結合した結果となる)toConcurrentMap(Function, Function)
, toConcurrentMap(Function, Function, BinaryOperator)
, toMap(Function, Function, BinaryOperator, Supplier)
public static <T> Collector<T,?,IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper)
int
生成マッピング関数を適用し、その結果の値のサマリー統計を返すCollector
を返します。T
- 入力要素の型mapper
- 各要素に適用するマッピング関数Collector
summarizingDouble(ToDoubleFunction)
, summarizingLong(ToLongFunction)
public static <T> Collector<T,?,LongSummaryStatistics> summarizingLong(ToLongFunction<? super T> mapper)
long
生成マッピング関数を適用し、その結果の値のサマリー統計を返すCollector
を返します。T
- 入力要素の型mapper
- 各要素に適用するマッピング関数Collector
summarizingDouble(ToDoubleFunction)
, summarizingInt(ToIntFunction)
public static <T> Collector<T,?,DoubleSummaryStatistics> summarizingDouble(ToDoubleFunction<? super T> mapper)
double
生成マッピング関数を適用し、その結果の値のサマリー統計を返すCollector
を返します。T
- 入力要素の型mapper
- 各要素に適用するマッピング関数Collector
summarizingLong(ToLongFunction)
, summarizingInt(ToIntFunction)
バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.