2016-03-28 2 views
1

Warum kann ich nicht auf die id Eigenschaft von Device zugreifen?Warum kann ich bei der Verwendung von Collectors.toMap nicht auf das Typfeld zugreifen?

final List<Device> devicesList = jsonFileHandlerDevice.getList(); 

ConcurrentMap<Integer, Device> map = 
     devicesList.stream() 
        .collect(Collectors.toMap(item -> item.id, item -> item)); 

wo

public class Device { 

    public MobileOs mobileOs; 
    public Integer id; 


    public Device() { 
    } 

    public Device(MobileOs mobileOs, double osVersion, int allocatedPort, Integer id, String uuid) { 
     this.mobileOs = mobileOs; 
     this.id = id; 
    } 
} 

hier sehen:

enter image description here

+0

Ich denke, Sie haben vielleicht eine irreführende Fehlermeldung erhalten. Ich glaube, dass der tatsächliche Fehler einen 'ConcurrentMap '- Typ verwendet, wenn der vom Kollektor zurückgegebene Typ' Map ' ist. Wenn Sie möchten, dass die zurückgegebene Map eine "ConcurrentMap" ist, müssen Sie die toMap-Variante verwenden, die einen Lieferanten akzeptiert (der den Typ der Map bestimmt, der zurückgegeben werden soll). – Eran

+0

sehen Sie meinen zusätzlichen Screenshot –

+0

Was ist die Fehlermeldung? –

Antwort

2

Sie haben eine irreführende Fehlermeldung. Der tatsächliche Fehler verwendet einen ConcurrentMap<Integer, Device>-Typ, wenn der vom Kollektor zurückgegebene Typ Map<Integer, Device> ist.

Wenn Sie die zurück Map wollen ein ConcurrentMap sein, können Sie die toMap Variante verwenden, die einen Anbieter akzeptiert (die den Typ des Map bestimmt werden zurückgegeben).

So etwas sollte funktionieren:

ConcurrentMap<Integer, Device> map = 
     devicesList.stream() 
       .collect(Collectors.toMap(item -> item.id, 
              item -> item, 
              (item1,item2)->item2, 
              ConcurrentHashMap::new)); 

oder als Alexis kommentiert, nur Collector.toConcurrentMap verwenden.

+0

_ "Sie müssen die ToMap-Variante verwenden" _ ... oder einfach 'Collectors.toConcurrentMap' verwenden. –

+0

@ AlexisC.Ich war mir dessen nicht bewusst. Es kam mir nicht in den Sinn, dass die API einen solchen Sammler enthalten könnte. Vielen Dank :) – Eran

Verwandte Themen