2016-04-26 8 views
3

Возможно ли передать параметризованный конструктор в качестве ссылки метода на map?передать параметризованный конструктор в качестве метода ссылки

У меня есть объект в моем коде, который выглядит, как этот

items.stream() 
     .map(it -> new LightItem(item.getId(), item.getName()) 
     .collect(Collectors.toList()); 

Мой список items constains несколько Item объектов

Item 
    id, name, reference, key... 

тогда LightItem имеет только два поля

LightItem 
    id, name 

Было бы хорошо, если бы это было по ssible сделать что-то вроде этого

items.stream().map(LightItem::new).collect(Collectors.toList()) 

ответ

5

Там только один способ использовать конструктор здесь, вы должны добавить новый конструктор LightItem класса:

public LightItem(Item item) { 
    this.id = item.getId(); 
    this.name = item.getName(); 
} 

Это позволит вам использовать код, который вы написали :

items.stream().map(LightItem::new).collect(Collectors.toList()) 

Если вы действительно не хотите, чтобы добавить новый конструктор LightItem, есть путь вокруг:

class MyClass { 

    public List<LightItem> someMethod() { 
     return items.stream() 
      .map(MyClass::buildLightItem) 
      .collect(Collectors.toList()); 
    } 

    private static LightItem buildLightItem(Item item) { 
     return new LightItem(item.getId(), item.getName()); 
    } 

} 
+1

@JoachimSauer это право, фиксированный это. Благодаря :) –

Смежные вопросы