2016-04-28 1 views
0

У меня есть два класса:Java 8 Список к карте с потоком (во избежание дубликатов)

public class Adegae implements java.io.Serializable { 
    private AdegaeId id; 
    ... 
} 

и

public class AdegaeId implements java.io.Serializable { 

    private String gpi; 
    private String mccode; 
    private String aecode; 
    ... 
} 

У меня также есть список, которые имеют элементы с duplaicates из aecode:

List<Adegae> adegaes = ... 

Я строю свою карту так:

Map<String, Adegae> adegaeMap = adegaes.stream() 
      .collect(Collectors.toMap(adegae -> adegae.getId().getAecode().trim(), 
        Function.identity())); 

Когда я запускаю мой код, я получаю это исключение:

java.lang.IllegalStateException: Duplicate key [email protected] 
at java.util.stream.Collectors.lambda$throwingMerger$0(Collectors.java:133) 
at java.util.HashMap.merge(HashMap.java:1245) 
at java.util.stream.Collectors.lambda$toMap$58(Collectors.java:1320) 
at java.util.stream.ReduceOps$3ReducingSink.accept(ReduceOps.java:169) 

Интересно, если есть способ, чтобы собрать на карту, понижая дубликаты в то же время.

+2

Да, вы должны предоставить mergeFunction в качестве 3-го параметра. См. Связанный вопрос. – Tunaki

+0

Вы измените adeges из списка в Set (Set avoid duplicates), можете сделать что-то вроде: List list = ... Set set = new HashSet (список); –

+1

@ DanielHernández Trickier, поскольку дубликаты - это не сам объект, а свойство объектов. – Tunaki

ответ

1

Map<String, Adegae> adegaeMap = adegaes.stream() .collect(Collectors.toMap(adegae -> adegae.getId().getAecode().trim(), Function.identity(), (e1, e2) -> e1)); может помочь в вашем случае

+0

Именно так ответ Тунаки находится в дублированном вопросе – serge

0

Вы можете использовать метод distinct() на Stream, чтобы устранить дубликаты перед дальнейшей обработкой.

+0

Сложнее, поскольку дубликаты - это не сам объект, а свойство объектов. – Tunaki

+0

Да, это зависит от метода 'equals()', но здесь можно надеяться, что объекты с одинаковым ID равны. – erickson

+0

Это решение не подходит для моего случая, так как это автоматически сгенерированный класс из Hibernate, и я использую только часть всего ключа. – serge