2017-05-03 9 views
1

Zusätzlich zu meiner Frage zuvor gefragt, die hier gefunden werden kann, How to combine list elements and find the price of largest combinationWie konvertiert man den Stream?

Statt Integer price zu verwenden, ich String price verwende,

List<Long> highest = details 
       .stream() 
       .map(d -> Stream.concat(Stream.of(d.getDetailId()), d.getStackableDetails().stream()).collect(Collectors.toList())) 
       .collect(Collectors.toMap(s -> s.stream().map(Double.class::cast).reduce(0D, 
         (left, right) -> left + Double.parseDouble(map.get(right).getPrice())), 
         s -> s.stream().collect(Collectors.toList()), 
         (left, right) -> right, 
         TreeMap::new)) 
       .lastEntry().getValue(); 

Aber ich halte eine Klasse Guss Ausnahme erhalten, während des Lauf gleich. Kann mir jemand sagen, warum ich den Streamtyp nicht übertragen kann und wie ich das korrigieren kann? Vielen Dank!

+0

post die tatsächliche Fehlermeldung/stacktrace – Eugene

+0

java.lang.ClassCastException: Guss Kann nicht java.lang.Long zu java.lang.Double –

+0

ja, zum Beispiel 'String Preis = "30.0". –

Antwort

2

Es ist mir nicht ganz klar, was Sie zu tun versuchen, aber es hat keinen Sinn, eine TreeMap zu füllen, nur um das letzte Element zu bekommen. Das Erhalten des maximalen Elements wird als eine intrinsische Stream Operation bereitgestellt.

Also, was Sie in der Frage des Code tun können

List<Long> highest = details 
    .stream() 
    .map(d -> Stream.concat(Stream.of(d.getDetailId()), d.getStackableDetails().stream()) 
        .collect(Collectors.toList())) 
    .max(Comparator.comparingDouble(s -> s.stream() 
         .mapToDouble(l -> Double.parseDouble(map.get((double)l).getPrice())) 
         .sum())) 
    .get(); 

vereinfacht werden Dies behebt auch Probleme, indem einfach die Long zu double Gießen. Dadurch wird das Objekt zu einem long-Wert dekomprimiert, eine Erweiterung der Konvertierung in double durchgeführt und es in eine Double für die Map-Suche eingeordnet. Es wird jedoch nicht empfohlen, Double Objekte als Map-Schlüssel zu verwenden.

+0

Habe ich etwas übersehen? Woher kam die 'map' (' map.get ((double) l) '? – Roland

+0

@Holger' TreeMap' Vorschlag war ich idiotisch und schreibe und antworte in Eile ...Seien Sie schuld, nicht das OP – Eugene

+2

@Roland: Ich weiß nicht, woher es kommt, aber es ist in der OP-Code und ich verwende es genau auf die gleiche Weise ... Aus dem Zusammenhang können wir schließen, dass es ein sein muss Karte '. Beachten Sie, dass sich der OP-Code seit der letzten Frage weiterentwickelt hat. – Holger

2

Ihr Problem ist höchstwahrscheinlich hier:

s -> s.stream().map(Double.class::cast) 

Ihre detailId vom Typ Long; aber Sie versuchen, das zu einem Double umzuwandeln.

+0

Ja, das stimmt ... Hier wird die Ausnahme ausgelöst. –

+0

Aber Casting ist nicht von lang zu doppelt gültig. Bitte lassen Sie mich wissen, was ich vermisse, auch gibt es eine alternative Möglichkeit, dies zu tun. –

+1

Das Umwandeln vom primitiven Typ 'long' in den primitiven Typ' double' ist gültig, aber das Umwandeln von 'Long' nach' Double' ist nicht möglich, da 'Long' keine Unterklasse von' Double' ist. Sie können stattdessen '.map (Long :: doubleValue)' verwenden. – Holger

1

Fast eine Kopie my answer to your other question:

double maxPrice = details.stream() 
    .mapToDouble(detail -> Stream.concat(Stream.of(detail.getDetailsId()), 
             detail.getStackableDetails().stream()) 
    .flatMap(detailId -> details.stream() 
     .filter(candidateDetail -> detailId.equals(candidateDetail.getDetailsId()))) 
    .map(Detail::getPrice) 
    // the applied transformation function of your String price to double: 
    .mapToDouble(Double::parseDouble) 
    .sum() 
) 
    .max() 
    .orElse(0.0); 
Verwandte Themen