使用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這說明了'年齡',但不是'男':) –
本質上,我正在尋找一種方法來封裝不同類型的多個操作,並將它們插入管道中,就像它們是單個操作一樣。 –