gpt4 book ai didi

java - 如何将特殊字段从类转发到 Vaadin 的网格?

转载 作者:行者123 更新时间:2023-12-01 19:59:54 24 4
gpt4 key购买 nike

我有一堂 StockDayRating 类(class):

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;
}
}

现在我想将“Stock::getStockDayRating”添加到 Vaadin 的网格中(到目前为止一切正常):

grid.addColumn(Stock::getStockDayRating).setCaption("Value");

问题是当我想将“Stock::getStockDayRating::getClose”添加到 Vaadin 中的网格时,而不是整个列表,而只是特殊字段“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();
}
});

The problem is when I want to add (...) not the whole list but only special field "close". Something like below works but it is only direct into 0 index element but I would like for all elements grid.addColumn(stock->stock.getStockDayRating().get(0).getC‌​lose());

stock.getStockDayRating() 返回 StockDayRating 的列表,并假设 StockDayRating.getClose() 返回 BigDecimal 。您想要将 List<StockDayRating> 转换为 List<BigDecimal> 收盘价。

为此,您可以使用流操作 mapcollect 将转换后的流转换为 List :

stock-> stock.getStockDayRating().stream()
.map(StockDayRating::getClose)
.collect(Collectors.toList())
  1. map 返回一个流,其中包含将给定函数应用于流元素的结果。
  2. collect 使用 Collector 对此流的元素执行 mutable reduction
  3. 方法 toList (来自 java.util.stream.Collectors )返回 Collector ,它将输入元素累积到新的 List 中。

关于java - 如何将特殊字段从类转发到 Vaadin 的网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48392100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com