如何在Java 8中使用比较器按参数对流进行排序?

3

如何使用Java 8中的比较器和参数对集合进行排序?

这里有一段代码:

    List<Point> sortedNeurons = neurons.parallelStream()
        .sorted((n1, n2) -> Double.compare(
            n1.getEuclideanDistanceFrom(inputVector),
            n2.getEuclideanDistanceFrom(inputVector)))
        .collect(Collectors.toList());

你被赋予一个参数inputVector,可以将其传递给返回原始double值的函数。如果应用于集合的元素,则返回某个数字。 我希望按照这个值对集合进行排序。 类似于:select id from neurons order by getEuclideanDistanceFrom(inputVector,id);
以下是三个问题:
1. nx.getEuclideanDistanceFrom(inputVector) 会重复两次。 2. 我想使用double类型的自然排序,不需要声明它,就像在SQL查询中使用order by子句一样。 3. 可以用双冒号::符号替换n1,n2 -> n1,n2。
附言:我强烈感觉可以使用类似于bifunction或biconsumer的东西来解决,但是无法弄清楚...
3个回答

8
也许您可以使用Comparator#comparingDouble来实现:
List<Point> sortedNeurons = neurons.parallelStream()
    .sorted(Comparator.comparingDouble(p -> p.getEuclideanDistanceFrom(inputVector)))
    .collect(Collectors.toList());

2

这看起来不错。我让它变得更好了:

List<Point> sortedNeurons = neurons.parallelStream()
    .sorted(Comparator.comparingDouble(inputVector::getEuclideanDistanceFrom))
    .collect(Collectors.toList());

然后我意识到,你甚至可以让它更短:

List<Point> sortedNeurons =
neurons.sort(Comparator.comparingDouble(inputVector::getEuclideanDistanceFrom));

显然,流不适合用于排序东西...


不确定您所说的“流不适合排序”,第一个片段似乎相当合理。如果“neurons”是一个列表,则第二个片段无法工作。“List.sort()”方法会就地对列表进行排序并返回void。 - Stuart Marks
你是正确的。这就是我所需要的一切。从5行代码到1行!再也找不到比这更好的了:neurons.sort(Comparator.comparingDouble(inputVector::getEuclideanDistanceFrom)); - Lukasz Ochmanski

0

我还找到了一种方法可以提取可重复使用的比较器:

public interface Functional<T> {
    public int compareByEuclideanDistance(T o1, T o2);
}

public class Point implements Functional<Point> {
    @Override
    public int compareByEuclideanDistance(Point o1, Point o2) {
        return Double.compare(this.getEuclideanDistanceFrom(o1),
            this.getEuclideanDistanceFrom(o2));
    }
}

现在你可以进行任何调用,例如:

neurons.parallelStream()
    .sorted(input::compareByEuclideanDistance)
    .collect(Collectors.toList());

或者

neurons.parallelStream().min(input::compareByEuclideanDistance).get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接