了解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上找到
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : http://www.leveluplunch.com/java/tutorials/039-group-objects-by-field-java8/
内容来源于网络,如有侵权,请联系作者删除!