2015-10-28 3 views
9

Я пытаюсь передать список парных чисел в Map<Double, Double>, где ключи являются парными в исходном списке, а значения - это некоторое вычисленное значение.Как преобразовать лямбда-параметры в используемые объекты?

Это то, что мой код выглядит следующим образом:

// "values" is a List<Double> that was passed in 
ImmutableMap<Double, Double> valueMap = values.parallelStream() 
    .collect(Collectors.toMap(p -> p, p -> doThing(values, p))); 

private Double doThing(List<Double>, Double p) { 
    Double computedValue = 0.0; 
    // Do math here with p 
    return computedValue; 
} 

Однако IntelliJ жалуется, что p -> p не является допустимым лямбда-выражение - это жалуется циклическом умозаключений. Я также получаю сообщение об ошибке, когда я вызываю doThing, потому что p является параметром лямбда, а не двойным.

Когда я пытаюсь наложить p на номер Double, позвоните по номеру doThing, который не отображается.

Я пропустил что-то действительно очевидное? Кажется, нет никакого способа сделать что-либо с моими параметрами лямбда ...

ответ

6

Я думаю, проблема здесь в том, что ваша операция по сбору возвращает Map<Double, Double>, но тип valueMap - ImmutableMap<Double, Double>.

Вы также забыли указать имя параметра List<Double> в doThing, но я предполагаю, что это была опечатка при написании вопроса.

+0

Вы правы насчет опечатки, извините. Изменение его на карте вместо ImmutableMap, похоже, устранило проблему. Вы знаете, почему ошибки, которые я видел, были, по-видимому, не связаны? Для такой ошибки я ожидал бы что-то вроде ошибки несоответствия типа между возвращаемым значением .collect() и объявленным типом valueMap. Почему в мире объявленное несоответствие типа вызывает циклическую ошибку вывода ...? – sichinumi

+1

@sichinumi Я попробовал его с Eclipse и получил несоответствие _Type: невозможно преобразовать из Map в ImmutableMap _. Итак, ошибка, которую вы получили, действительно немного странная. – Bubletan

+2

Afaik, IntelliJ использует 'javac' так же, как Netbeans, поэтому я могу подтвердить, что сообщения об ошибках, связанные с выводом Generics/Type или Lambda Expressions, могут быть запутанными и далекими от реальной проблемы. Иногда просто забытые ')', '>' или ';' могут вызывать множество абсурдных, бесполезных сообщений об ошибках. – Holger

1

Как указано, проблема в том, что Collectors.toMap накапливает элемент в Map<K,U> (текущая реализация возвращает HashMap, но это внутренняя деталь).

Если вы хотите собрать в ImmutableMap, вы можете использовать коллекцию collectingAndThen.

Использовать Collectors.toMap как нижестоящий коллектор и предоставить функцию map -> ImmutableMap.copyOf(map) в качестве финишера.

ImmutableMap<Double, Double> valueMap = values.stream() 
       .collect(collectingAndThen(toMap(p -> p, p -> doThing(values, p)), ImmutableMap::copyOf));