我有一个StockDayRating类别:
public class StockDayRating {
private String close;
public String getClose() {
return close;
}
}
和类库存:
public class Stock {
private String name;
private List<StockDayRating> stockDayRating;
public String getName() {
return name;
}
public List<StockDayRating> getStockDayRating() {
return stockDayRating;
}
}
现在,我想在Vaadin的网格中添加“ Stock :: getStockDayRating”(到目前为止一切正常):
grid.addColumn(Stock::getStockDayRating).setCaption("Value");
问题是当我想在Vaadin中将“ Stock :: getStockDayRating :: getClose”添加到网格时,而不是整个列表,而仅是特殊字段“ close”。
像这样的东西(下面)不起作用,我也不知道如何解决:
grid.addColumn(Stock::getStockDayRating::getClose).setCaption("Value");
Vaadin的Grid方法如下所示:
public <V> Grid.Column<T, V> addColumn(ValueProvider<T, V> valueProvider) {
return this.addColumn((ValueProvider)valueProvider, (AbstractRenderer)(new TextRenderer()));
}
输出错误为:
method reference not expected here
非常感谢你。
最佳答案
grid.addColumn(stock-> stock.getStockDayRating().stream()
.map(StockDayRating::getClose)
.collect(Collectors.toList()));
(因为
Stock::getStockDayRating::getClose
是无效的语法)。为什么?
addColumn
中的方法Grid
接收类型为ValueProvider<T,V>
的参数addColumn(ValueProvider<T,V> valueProvider)
其中
ValueProvider<T,V>
是具有方法V apply(T source)
的functional interface。Stock::getStockDayRating
是对返回getStockDayRating
的类Stock
中的方法List<StockDayRating>
的引用。然后,Stock::getStockDayRating
与ValueProvider<Stock,List<StockDayRating>>
兼容,并且addColumn(Stock::getStockDayRating)
归结为:grid.addColumn(new ValueProvider<Stock,List<StockDayRating>>(){
List<StockDayRating> apply(Stock stock) {
return stock.getStockDayRating();
}
});
现在,假设您要显示列表的大小(即
stock.getStockDayRating().size()
)。您不能将其编写为方法参考,因为涉及两个方法调用,因此您需要使用与stock->stock.getStockDayRating().size()
兼容的lambda expression ValueProvider<Stock,Integer>
使用Java 7语法(虽然更为冗长,但在Java 8中同样有效),可以写成:
grid.addColumn(new ValueProvider<Stock,Integer>(){
Integer apply(Stock stock) {
return stock.getStockDayRating().size();
}
});
问题是当我不想添加(...)而不是整个列表,而仅添加特殊字段“关闭”时。像下面这样的东西,但它只能直接进入0索引元素,但我希望所有元素
grid.addColumn(stock->stock.getStockDayRating().get(0).getClose());
stock.getStockDayRating()
返回StockDayRating
的列表,并假定
StockDayRating.getClose()
返回BigDecimal
。您想将
List<StockDayRating>
转换为收盘价List<BigDecimal>
。为此,可以使用流操作map并将collect转换后的流转换为
List
:stock-> stock.getStockDayRating().stream()
.map(StockDayRating::getClose)
.collect(Collectors.toList())
map
返回由将给定功能应用于流元素的结果组成的流。collect
使用Collector
在此流的元素上执行mutable reduction。方法
toList
(来自java.util.stream.Collectors
)返回一个Collector
,它将输入元素累积到新的List
中。