Я пытаюсь использовать потоки Java для достижения той же логики, что и ниже. По сути, я пытаюсь выяснить, есть ли в коллекции две записи с одинаковым идентификатором журнала и тегом более одного раза
class Log {
private String id;
private List tags;
};
void findLogsWithSameTag(List logs) {
final Map map = new HashMap();
for ( var log : logs ) {
for ( var tag : log.getTags() ) {
Integer count = map.computeIfAbsent( log.getId(), key -> new HashMap())
.getOrDefault( tag, 0);
map.get( log.getId() ).put( tag, count + 1 );
}
}
for ( final var entry : map.entrySet() ) {
for ( final var entry2 : entry.getValue().entrySet() ) {
if ( entry2.getValue() > 1 ) {
throw new IllegalArgumentException("bad!");
}
}
}
}
Сначала я попытался сгруппировать журналы по тегам, но не знаю, как с помощью FlatMap сделать ключ строкой вместо Список. Затем я попытался сгруппировать по Log::getId, но мне снова не удалось сопоставить теги со строкой.
Кто-нибудь знает, как это сделать с помощьюstream().groupingBy(...)?
edit: добавление нескольких примеров:
// should throw as log1 has tag1 twice
List.of(
new Log("log1", List.of( "tag1", "tag2") )
new Log("log1", List.of( "tag1") )
);
// should not throw as there is no tag more than once associated with an id
List.of(
new Log("log1", List.of( "tag1", "tag2") )
new Log("log2", List.of( "tag1") )
);
Подробнее здесь: https://stackoverflow.com/questions/783 ... groupingby