2015-10-03 4 views
0

я следующий кодом:Transform на карту с предсказуемым порядком

users.stream() 
       .sorted((u1, u2) -> u2.getScore().compareTo(u1.getScore())) 
       .limit(count) 
       .collect(Collectors.toMap((User::getName), (User::getScore))); 

Содержанием результата является правильным, но когда я хочу Foreach его - это выход в непредсказуемом результате. Я думаю, это потому, что под капотом используется HashMap.

Есть ли способ собирать в mp с прогнозируемым результатом?

+1

Используйте 'toMap ( Функция keyMapper, функция valueMapper, BinaryOperator mergeFunction, Поставщик mapSupplier)' , и заставить функцию слияния выдать исключение, если оно не должно было случиться. –

+0

@Alexis C. Я не должен предоставлять функцию слияния. У меня есть уникальные имена – gstackoverflow

+2

Вот почему я сказал, чтобы исключить функцию слияния. –

ответ

0

Это работает:

  return users.stream() 
      .sorted((u1, u2) -> u2.getScore().compareTo(u1.getScore())) 
      .limit(count) 
      .collect(Collectors.toMap((User::getName), (User::getScore), (k, v) -> { 
         throw new RuntimeException(String.format("Duplicate key %s", k)); 
        }, 
        LinkedHashMap::new));