在这篇文章中,我们将重点介绍如何使用Java流处理数据的后处理。我们还将看到非常强大的技术来优化和排序结果。
数字技术收集的海量数据创造了大数据分析的爆炸式增长。它允许公司、政府和其他组织发现模式并预测未来的行为。例如,它可以帮助销售预测,营销活动,解决和预防犯罪等。可能性是不同的和无限的。
同样,人工智能应用程序和神经网络特别使用大数据集。在用神经网络建模的复杂问题上,收集大量格式化和标注的数据是非常重要的。我们将这些数据分成训练和测试数据集,我们使用这些数据来获得模型的权重矩阵的值。
前几点的重点是将处理大量数据的需求带回家,我们用这些应用程序格式化、标记和优化这些数据。通常,在处理数据之前和之后都需要进行这种数据操作。由于所涉及的数据量很大,很难格式化、处理和有效地存储这些数据。
在本文中,我们将重点讨论如何使用Java流处理数据的后处理。我们将看到非常强大的技术来优化和排序结果。重点将放在提供非常有效的机制来处理数据、轻松地并行计算和允许使用功能接口快速交换实现。
优化技术
让我们考虑一个简单的例子,其中我们有一个要处理的事件列表。我们并不关心如何获得此列表,无论是批处理、分析工具,还是为我们选择要优化、排序和分类的候选事件列表的任何其他机制。
我们将要考虑的事件非常简单,并且有一个非常通用的结构。这只是为了演示的目的。我们也可以考虑其他实体,如客户,住房,报告等。接下来的分析将适用于广泛的案例。
我们定义具有以下实现的事件:
public static record Event(String location, int price, String eventType, int eventRankId) {}
注意,我们使用Java记录若要定义事件,请执行以下操作。这个记录是定义类的简明方法。该实体有四个字段:位置、价格、事件类型和事件RankId。EventRankId是唯一定义事件的主键。
首先,让我们解决一个简单的问题:假设我们希望选择一个由10个事件组成的列表,这些事件离给定的位置最近。主要的要求是我们希望这个操作是可并行的和可执行的。同时,我们希望实现此选择的算法是可插拔的,因此当我们想要更改实现时,我们可以无缝地交换它。
作为一个例子,让我们编写下面的代码来获得两个位置之间的距离:
public static int evaluateLocationProximity(String location1, String location2) {
return Math.abs(location1.hashCode() - location2.hashCode());
}
此函数以两个位置作为参数,并返回一个表示它们之间距离的数字。方法签名及其实现是不现实的,在这里只是为了演示目的。在生产环境中,该函数可以找到两个地点之间的最佳路线,并根据旅行时间、物理邻近性或便利性分配一个值。返回值越小,这两个位置就越近,从一般意义上说,我们已经定义了它们。
我们需要将这个算法应用到给定的事件列表中。我们希望根据此函数的返回值对事件进行排序。
让我们使用JavaStreams查看以下实现
public static List<Event> getNearEvents(int number, List<Event> events, String targetLocation) {
Map<Integer, Set<Event>> distanceEventsMap = events.stream().
collect(Collectors.groupingBy(
event -> evaluateLocationProximity(event.location(), targetLocation)