Ich versuche, eine Liste von Doubles in eine Map<Double, Double>
zu streamen, wo die Schlüssel die Doubles in der ursprünglichen Liste sind, und die Werte sind einige berechnete Werte. DieseWie konvertiere ich Lambda-Parameter in verwendbare Objekte?
ist, was mein Code wie folgt aussieht:
// "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;
}
jedoch IntelliJ reklamierte und p -> p
ist kein gültiger Lambda-Ausdruck - es geht um eine zyklische Folgerung zu beklagen. Ich bekomme auch einen Fehler, wenn ich doThing
aufrufen, weil ein Lambda-Parameter und kein Double ist.
Wenn ich versuche, zu einem Double
in den Aufruf an doThing
zu werfen, schlägt das fehl, zu übertragen.
Fehle ich etwas wirklich offensichtlich? Es scheint, als ob es keine Möglichkeit gibt, um tatsächlich etwas mit meinen Lambda-Parametern zu tun ...
Sie haben Recht mit dem Tippfehler, tut mir leid. Es scheint das Problem behoben zu haben, indem man es in eine Map statt in eine UnmableableMap änderte. Weißt du, warum die Fehler, die ich sah, scheinbar nichts miteinander zu tun hatten? Für einen solchen Fehler hätte ich etwas wie einen Typenkonfliktfehler zwischen dem Rückgabewert von .collect() und dem deklarierten Typ von valueMap erwartet. Warum in der Welt würde ein erklärter Typ-Mismatch einen zyklischen Inferenzfehler verursachen ...? – sichinumi
@sichinumi Ich versuchte es mit Eclipse und bekam _Type Mismatch: kann nicht von Map
Afaik, IntelliJ verwendet 'javac' genau wie Netbeans, so kann ich bestätigen, dass Fehlermeldungen, die entweder mit Generics/Type Inference oder Lambda Expressions verbunden sind, verwirrend und weit entfernt vom eigentlichen Problem sein können. Manchmal kann nur ein vergessenes ')', '' 'oder'; 'viele absurde, nicht hilfreiche Fehlermeldungen verursachen. – Holger