2016-04-26 9 views
2

In Intellij 15.0.3. und mit Java8 habe ich ein Problem bei der Verwendung ::new. Insbesondere habe ich eine Klasse mit einem Standard-KonstruktorJava8-Berichte "kann Konstruktor nicht auflösen" durch Aufrufen von ":: new"

public class Container{ 

    public Container(){} 

} 

Ich möchte eine Karte aus einer Liste erstellen, wie folgt:

public class Test{ 
    private final Map<Key, Container> map; 

    @Before 
    public void setUp(){ 
    List<Key> keys=...//Init the list 
    map = keys.stream().collect(Collectors.toMap(Function.identity(), Container::new)); 


    } 

} 

In Intellij, new ist rot und der Tooltip sagt cannot resolve constructor Container

Wenn ich () -> {new Container()} habe ich auch cannot infer functional interface type Container

Jede Idee, warum?

Antwort

3

Jede Zuordnungsfunktion soll ein Key Argument akzeptieren. Function.identity() tut, aber Container::new nimmt keine Parameter. Das Gleiche gilt für () -> new Container(). Sie benötigen ein Einargument Lambda. Ein Argument, das Sie ignorieren werden, wie es passiert.

map = keys.stream().collect(Collectors.toMap(Function.identity(), key -> new Container())); 
-2

sollte es sein, so etwas wie:

Collectors.toMap(Container::getMyUniqueField, Function.identity()) 

Dieser Getter für Schlüssel verwenden, und das Objekt selbst als der Wert, in der geschaffenen hashmap.

+0

'toMap' hat zwei Parameter. Der erste ist der _keyMapper_ (also habe ich 'Function.identity()', der zweite ist der _valueMapper_, der eine neue Instanz der 'Container' Klasse zurückgeben muss. Du invertierst Schlüssel und Wert. –

+0

Genau was du willst doesn Es ergibt keinen Sinn – NimChimpsky

Verwandte Themen