Ваш код может быть улучшен как
List<String> list = Arrays.asList("Abcd", "Abcd");
Map<String, Integer> map = list.stream()
.collect(Collectors.toMap(Function.identity(), String::length, (a, b) -> a));
System.out.println(map.size());
Или, возможно, для вашего случая использования Я не хочу ничего делать для двух значений одного и того же ключа, я просто хотел вернуть одно значение , вы можете просто выбрать случайный возврат любое значение в использовании реализации следующим образом:
private static <T> BinaryOperator<T> any() {
return Math.random() < 0.5 ? ((x, y) -> x) : ((x, y) -> y);
}
и затем в вашем коде используйте его как
Map<String, Integer> map = list.stream()
.collect(Collectors.toMap(Function.identity(), String::length, any()));
Благодаря предложениям Хольгера, Юджина и Федерико, есть и другие эффективные реализации метода any
, которые могут фактически включать использование:
private static <T> BinaryOperator<T> any() {
// suggested by Holger
return ThreadLocalRandom.current().nextBoolean() ? ((x, y) -> x) : ((x, y) -> y);
// suggested by Eugene
long nt = System.nanoTime();
((nt >>> 32) ^ nt) > 0 ? ((x, y) -> x) : ((x, y) -> y);
}