我有一个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::getStockDayRatingValueProvider<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).getC‌​lose());


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中。

07-24 21:40