减少图表代码

时间:2016-01-10 20:59:22

标签: java javafx javafx-8

我想减少图表代码,因为我有太多的变量,我相信可以减少。

存储数据的对象:

public class EventsObj
{
    private String date;
    private int info;
    private int error;
    private int warning;
    private int critical;

    public EventsObj()
    {
    }

    public EventsObj(String date, int info, int error, int warning, int critical)
    {
        this.date = date;
        this.info = info;
        this.error = error;
        this.warning = warning;
        this.critical = critical;
    }

    public String getDate()
    {
        return date;
    }

    public void setDate(String date)
    {
        this.date = date;
    }

    public int getInfo()
    {
        return info;
    }
................

来自SQL查询的数据列表:

    List<EventsObj> eventsObj = new ArrayList<>();

 eventsObj.add(new EventsObj(String.valueOf(rs.getTimestamp("EVENT_DATE")), rs.getInt("INFO"), rs.getInt("WARN"), rs.getInt("CRITICAL"), rs.getInt("ERROR"))); 

但是当我想在饼图中使用数据时,我使用了这个丑陋的代码:

ObservableList<PieChart.Data> pieChartData = FXCollections.observableArrayList();

int info = 0;
        int error = 0;
        int warning = 0;
        int critical = 0;

        for (int i = 0; i < eventsObj.size(); i++)
        {
            EventsObj get = eventsObj.get(i);
            info = get.getInfo() + info;
            error = get.getError() + error;
            warning = get.getWarning() + warning;
            critical = get.getCritical() + critical;
        }

        pieChartData.add(new PieChart.Data("Info", info));
        pieChartData.add(new PieChart.Data("Error", error));
        pieChartData.add(new PieChart.Data("Warning", warning));
        pieChartData.add(new PieChart.Data("Critical", critical));


        final PieChart chart = new PieChart(pieChartData);

您能否提出一些更简单的解决方案来从List获取数据并将其插入饼图?

1 个答案:

答案 0 :(得分:1)

可能存在牺牲一些可读性的风险(我猜这取决于你对Java 8功能的熟悉程度),你可以做类似的事情

private <T> PieChart.Data createPieData(List<T> items, String name,
        ToIntFunction<T> function) {

    int value = items.stream().collect(Collectors.summingInt(function));
    return new PieChart.Data(name, value);
}

然后

final PieChart chart = new PieChart();

chart.getData().add(createPieData(eventsObj, "Info", EventsObj::getInfo));
chart.getData().add(createPieData(eventsObj, "Error", EventsObj::getError));
chart.getData().add(createPieData(eventsObj, "Warning", EventsObj::getWarning));
chart.getData().add(createPieData(eventsObj, "Critical", EventsObj::getCritical));

但是,说实话,我还没有看到你的原始代码有什么问题。