将Comparable对象的较低和较大实例提取到专用变量中

时间:2016-06-14 23:22:19

标签: java java-8

我不确定这是一个愚蠢或琐碎的问题,但我一直在寻找一段时间,我无法得到答案。

我的项目经常重复以下几个方面:

void someMethod(Timeslot t1, Timeslot t2) {
    Timeslot start, end;
    if (t1.compareTo(t2) >= 0) {
        start = t1;
        end = t2;
    } else {
        start = t2;
        end = t1;
    }
    // do something with start and end
}

t1t2通常是范围的限制,但该方法并不要求第一个参数为下限,第二个参数为更高,所以我只是做你可以在上面看到的,找出哪个极限是非常微不足道的。

我只想干,所以我想知道是否有一些方法或某种方式以更简洁的方式做到这一点,可能有些Java 8新功能让我们这样做。像这样的东西?

void someMethod(Timeslot t1, Timeslot t2) {
    Timeslot t1, t2;
    assignLimits(t1, t2, Timeslot::compareTo); // does this exist?
}

也许我所要求的绝对是微不足道的,我错过了一些明显的东西。在这种情况下,请帮我看看。或许,重复原始组块并没有错。

1 个答案:

答案 0 :(得分:0)

不可能提供这样的效用函数,因为您不能通过引用传递两个局部变量,并且无法从要分配给两个变量的方法返回两个值。所有试图解决这些限制的尝试都会因为交换两个局部变量而被认为是过度的,因此大多数开发人员都不会使用它们。

为了完整起见,这里有一些替代方案:

  1. 初始化为给定,仅在必要时进行交换

    void someMethod(Timeslot t1, Timeslot t2) {
        Timeslot start=t1, end=t2;
        if (t1.compareTo(t2) < 0) {
            start = t2;
            end = t1;
        }
        // do something with start and end
    }
    

    由于t1t2仍然可用,我们可以在此处使用它们进行交换而不使用临时变量。我们也可以重用t1作为开始,t2作为结束,所以我们不需要初始赋值,然而,在这种情况下,交换需要一个临时变量,因此可读性不会提高

  2. 通过辅助方法:

    static final <T extends Comparable<? super T>> T max(T t1, T t2) {
        return t1.compareTo(t2)>=0? t1: t2;
    }
    static final <T extends Comparable<? super T>> T min(T t1, T t2) {
        return t1.compareTo(t2)<0? t1: t2;
    }
    void someMethod2(Timeslot t1, Timeslot t2) {
        Timeslot start=min(t1, t2), end=max(t1, t2);
        // do something with start and end
    }
    

    可以重复使用这些方法。请注意,min函数有意对相等元素有不同的行为,以避免获得两个相同的对象,如果两个不同的对象(根据其自然顺序相等)被传递到方法中。明显的缺点是需要进行两次比较。

  3. 通过Stream:

    void someMethod3(Timeslot t1, Timeslot t2) {
        Timeslot[] range=Stream.of(t1, t2).sorted().toArray(Timeslot[]::new);
        // do something with range[0] and range[1]
    }
    

    这是类似解决方案系列的示例,例如Timeslot[] range={ t1, t2}; Arrays.sort(range);等等。它们是最简洁的解决方案,但需要将这两个值表示为数组,这表明预先构建的函数的问题不能返回多个值(不使用对象/数组)。