Java 8 Streamsでは、ストリームパイプラインを壊さないような方法で中間ストリーム操作をカプセル化して再利用することは可能ですか?パイプラインを壊すことなく中間ストリーム操作をカプセル化できますか?
がJava Tutorial on streamsからこの例を考えてみましょう:
double average = roster
.stream()
.filter(p -> p.getGender() == Person.Sex.MALE)
.mapToInt(Person::getAge)
.average()
.getAsDouble();
は、私は私のコード全体に別の場所でフィルタとmapToInt操作を使用する必要があるとします。私が試してみて、それは例えば、再利用できるようにそのロジックをカプセル化する場合があります
IntStream maleAges(Stream<Person> stream) {
return stream
.filter(p -> p.getGender() == Person.Sex.MALE)
.mapToInt(Person::getAge)
}
これはいいですが、私は、ストリームパイプラインの混乱を作るために必要がある場合がありますそれを使用します。たとえば、Bobという男性の平均年齢を求める場合:
double averageBob =
maleAges(roster
.stream()
.filter(p -> "Bob".equals(p.getName()))
)
.average()
.getAsDouble();
もっと良い方法がありますか?私はこれらの線に沿って何かを考えています。それを行うには
double averageBob = roster
.stream()
.filter(p -> "Bob".equals(p.getName()))
.apply(this::maleAges) // Doesn't compile
.average()
.getAsDouble();
「int maleAges(Person p){return p.getAge();」とはどういう意味ですか? } 'を使い、' .map(this :: maleAges) 'を使う? –
@LuiggiMendozaそれは '年齢'を説明していますが、 '男性'のためのものではありません:) –
本質的に、私はさまざまなタイプの複数の操作をカプセル化し、それらをパイプラインに挿入する方法を探しています。 –