Sorki, nie zrozumiałem zagnieżdżenia tych list. Ta notacja trochę mnie myli. Ale już chyba kumam.
- Nie ma czegoś takiego jak
list1.dates
, tylko list1.get(0..).dates
- Uniknijmy exception, jeżeli żadnej daty nie podano.
Ostatecznie wychodzi mi tak:
ArrayList<Stream<LocalDate>> strumienieDat =
new ArrayList<Stream<LocalDate>>();
strumienieDat.add(obj.list1.stream().flatMap(L -> L.dates.stream()));
strumienieDat.add(obj.list2.stream().flatMap(L -> L.dates.stream()));
strumienieDat.add(obj.list3.stream().flatMap(L -> L.dates.stream()));
Stream<LocalDate> strumienDat = strumienieDat.stream()
.map(S -> S.max(LocalDate::compareTo))
// Mamy strumień typu Optional<LocalDate>, odfiltrujmy puste elementy
.filter(opt -> opt.isPresent())
// i wyciągnijmy daty z optionali.
.map(opt -> opt.get());
// W strumienDat mamy teraz listę dat maksymalnych z poszczególnych list.
//strumienDat.forEach(d -> {System.out.println("data: " + d);});
Optional<LocalDate> optD = strumienDat.min(LocalDate::compareTo);
if (optD.isPresent())
System.out.println("min: " + optD.get());
Dzięki za fajne ćwiczenie ze streamów i optionali. :)
Ale tak naprawdę wszystkie pola listN
powinny implementować jakiś wspólny interfejs posiadający getDates
. Inaczej to chyba błąd projektowy.
EDIT:
Jeszcze rozwiązanie w Groovy, czyli funkcjonalna java z dynamicznymi typami. No bo to najlepszy sposób na te pola dates
:
def listaListList = [ obj.list1, obj.list2, obj.list3 ]
def listaMaksDat = listaListList.collect {
arrayList -> arrayList.collect { o -> o.dates }
.flatten { date -> date }
.max()
}
def data = listaMaksDat.min()
println "To jest data albo null: $data"