使用 Java 流来查找集合中最接近的对

Using Java streams to find the closest pair in a set

我有一组元素,它们之间有一个距离度量。我正在寻找一种方法来从该集合中找到最接近的一对元素。使用循环我会使用以下算法:

double minDistance = Double.MAX_VALUE;
AbstractMap.SimpleEntry<Element, Element> closestPair;
for (Element element1 : elements) {
    for (Element element2 : elements) {
        double currentDistance = element1.distance(element2);
        if (!element1.equals(element2) && currentDistance  < minDistance) {
            minDistance = currentDistance;
            closestPair = new AbstractMap.SimpleEntry(element1, element2);
        }
    }
}
            

是否有使用 Java 流来实现此算法的优雅方法?

可能是这样的:

Optional<SimpleEntry> closestPair = elements.stream()
    .flatMap(elem -> elements.stream()
        .filter(other -> !elem.equals(other))
        .map(other -> new SimpleEntry(elem, other))
    .min(Comparator.comparingDouble(e -> e.getKey().distance(e.getValue()));

但您可能希望将这些内联 lambda 提取为单独的方法。