Если ваши идентификаторы уже уникальны, вы можете просто сделать:
public static void main(String[] args) {
Outer[] outers = {
new Outer(new Inner("a")),
new Outer(new Inner("b")),
new Outer(new Inner("c")),
new Outer(new Inner("a")),
new Outer(new Inner("b")),
new Outer(new Inner("c")),
};
Map<String, Outer> OutersById = Arrays.stream(outers).collect(Collectors.toMap(outer -> outer.inner.id, outer -> outer));
OutersById.forEach((k,v)->System.out.println(k+", "+v));
}
Но это приведет к исключению Duplicate Key.
Чтобы управлять своими дубликатами и использовать собственную стратегию устранения неоднозначности,
Map<String, Outer> OutersById = Arrays.stream(outers).collect(Collectors.toMap(outer -> outer.inner.id, outer -> outer));
Можно изменить на
Map<String, Outer> OutersById = Arrays.stream(outers)
.collect(
Collectors.toMap(
outer -> outer.inner.id,
outer -> outer,
(a, b) -> a.hashCode() > b.hashCode() ? a : b
));
Или любую другую стратегию, которую вы хотите, возможноНа External есть дата, которую можно сравнить?
Может быть, a и b можно объединить в новый объект ab?
Обновление:
public static void main(String[] args) {
Instant now = Instant.now();
Instant nxtWeek= now.plus(Duration.ofDays(7));
Outer[] outers = {
new Outer(new Inner("a"), null),
new Outer(new Inner("b"), Date.from(now)),
new Outer(new Inner("c"), Date.from(nxtWeek)),
new Outer(new Inner("a"), Date.from(now)),
new Outer(new Inner("b"), Date.from(nxtWeek)),
new Outer(new Inner("c"), null),
};
Comparator<Outer> outerRanker = Comparator.comparing(Outer::getFinishDate, Comparator.nullsLast(Date::compareTo));
Map<String, Outer> OutersById = Arrays.stream(outers)
.collect(
Collectors.toMap(
outer -> outer.inner.id,
outer -> outer,
(a, b) -> outerRanker.compare(a,b) > 0 ? a : b
));
System.out.println("today: "+Date.from(now));
OutersById.forEach((k,v)->System.out.println(k+", "+v));
}
Результаты в
today: Thu Jun 07 15:11:12 ACST 2018
a, Outer{inner=Inner{id='a'}, FinishDate=null}
b, Outer{inner=Inner{id='b'}, FinishDate=Thu Jun 14 15:11:12 ACST 2018}
c, Outer{inner=Inner{id='c'}, FinishDate=null}
Process finished with exit code 0