Java jest verbose i stream'y w Java są też verbose (gadatliwe?).
W Scali było by: cars.map(_.id) oraz cars.map(_.ownerId) i nie trzeba było by się bawić w żadne funkcje. Jak się użyje nieco lepszych streamów w Java np. Vavr, EclipseCollections to można zapisać w bardzo zwięzły sposób, podobnie jak w Scali.
W idiomatycznej Javie albo piszesz całą formułkę za każdym razem, albo sobie wyodrębniasz to do funkcji typu:
Kopiuj
Cars.getIds(cars)
Cars.getOwnerIds(cars)
i dalej:
Kopiuj
class Cars {
private Cars() { }
public static List<CarId> getIds(Collection<Cars> cars) {
return cars.stream().map(Car::getId).toList();
}
}
Albo można podejść do sprawy bardziej obiektowo i zrobić sobie obiekt "kolekcja samochodów":
Kopiuj
Cars cars = Cars.of(listOfCars);
cars.ids();
cars.ownerIds();
class Cars {
private final Collection<Car> cars;
public Cars(Collection<Car> cars) { this.cars = requireNonNull(cars); }
public List<CarId> ids() { return cars.stream()... }
}
Tyle że do tego ostatniego podejścia jest przyzwyczajona coraz to mniejsza liczba osób.