使用java 8按字段名分组对象

x33g5p2x  于2022-10-13 转载在 Java  
字(2.4k)|赞(0)|评价(0)|浏览(830)

了解java8如何提供按属性分组对象的本地支持

入门

微服务的增长可能会导致您发出一系列异步请求,其中您可能希望按标识符对对象进行逻辑分组。无论您是在web屏幕上,还是在处理大数据或进行一批异步请求,都可以根据java代码中的特定标准对java对象进行分组。让我们了解一下如何像使用SQL一样在java8中对对象进行分组。

设置

我们将在eclipse中生成一个项目和一个名为GroupingByField的类。接下来,我们将创建一个Stock类,它将作为我们演示的基础。注意,股票操作可能会变得复杂,所以我们选择了三个用例来展示java8分组API的强大功能。首先使用junit的设置方法,我们将看到来自基本Stock类的一系列股票交易。

class Stock {

    String symbol;
    String sold;
    Integer shares;

    //..
}

private List<Stock> stock;

@Before
public void setUp() {

    stock = new ArrayList<>();
    stock.add(new Stock("GOOGL", "N", 10));
    stock.add(new Stock("AAPL", "N", 5));
    stock.add(new Stock("YHOO", "N", 3));
    stock.add(new Stock("AAPL", "N", 9));
    stock.add(new Stock("GOOGL", "Y", 2));
    stock.add(new Stock("GOOGL", "Y", 5));
}

按符号分组股票

当您登录在线经纪人网站时,一个视图可能是基于股票代码的交易总数。看看我们的种子数据,我们已经与谷歌的股票进行了3次交易,其中一次仍然持有,而另一次已经售出。如果您有大量的交易,您会希望根据股票代码查看交易历史记录。要显示视图,将首先调用arraylist上的stream方法,然后调用传入分组函数的.collect方法。分组函数接受一个元素,该元素表示要对其执行分组的对象的键。返回类型为Map,其中键是股票符号,值是Stock元素的列表。
让我们运行这个示例来查看输出。

@Test
public void group_by_symbol_total_shares() {

    Map<String, List<Stock>> stockBySymbol = stock.stream().collect(
            Collectors.groupingBy(Stock::getSymbol));

    System.out.println(stockBySymbol);

}

输出

{GOOGL=[Stock [symbol=GOOGL, sold=N, shares=10], Stock [symbol=GOOGL,
sold=Y, shares=2], Stock [symbol=GOOGL, sold=Y, shares=5]],
AAPL=[Stock [symbol=AAPL, sold=N, shares=5], Stock [symbol=AAPL,
sold=N, shares=9]], YHOO=[Stock [symbol=YHOO, sold=N, shares=3]]}

总交易股份

在汇总层面上,您可能想知道特定股票的总交易股数。我们可以克隆前面的示例,并传入reduction收集器来计算特定股票的股份总数。
让我们运行我们的示例来查看结果。

@Test
public void group_by_symbol_traded() {

    Map<String, Integer> stockBySymbol = stock.stream().collect(
            Collectors.groupingBy(Stock::getSymbol,
                    Collectors.summingInt(Stock::getShares)));

    System.out.println(stockBySymbol);
}

输出

{GOOGL=17, AAPL=14, YHOO=3}

已发行股份

要了解您的账户余额,您需要了解已发行股票的总数。为了做到这一点,我们将以总股票交易为例。在执行分组之前,我们将从列表中删除已售出的交易,然后在执行分组时,它将只包含活跃股票。
让我们运行我们的示例来查看结果。

@Test
public void group_by_symbol_outstanding() {

    Map<String, Integer> stockBySymbol = stock.stream()
            .filter(stock -> stock.getSold().equals("N"))
            .collect(
            Collectors.groupingBy(Stock::getSymbol,
                    Collectors.summingInt(Stock::getShares)));

    System.out.println(stockBySymbol);
}

输出

{GOOGL=10, AAPL=14, YHOO=3}

java groupingBy有很多方法可以模拟SQL功能,但有很多可能性。例如,如果我们包括一个股价,您可以按符号分组并相乘以获得总账户价值。该列表可以继续按属性将对象分组为业务含义。感谢您加入今天的升级,祝您度过美好的一天!

此页面上的所有代码都可以在github:View the source上找到

相关文章