流的“ max”如何接受像“ Integer :: compareTo”这样的参数

2020-03-26 java lambda java-8 parameters stream

Stream.max()采用Comparator类型的参数,其中包含compare()方法; compare方法接受两个参数并返回一个int 。因此,我们可以使用一种方法来引用Integer#compare()作为max()方法的参数;但是Integer.compareTo()仅接受一个参数,该参数与compare()方法的参数数量不匹配,那么为什么还可以将其用作max()的参数呢?

那是我的代码:

Integer maxMenuTp = menuTpList.stream().max(Integer::compareTo);

Answers

Integer::compareTopublic int compareTo(Integer b)Integer是一个实例方法,因此它适合Comparator通过接受一个参数作为功能接口this ,第二个为所述方法的参数。

因此(a, b) -> Comparator.compare(a, b)(a, b) -> a.compareTo(b)都可以作为lambda参数。

使用max()之前,必须使用map函数。 尝试以下代码。

@Test
public void testMaxFromIntegerList(){

    List<Integer> menuTpList = new ArrayList<>();
    menuTpList.add(5);
    menuTpList.add(3);
    menuTpList.add(2);
    menuTpList.add(1);
    menuTpList.add(10);

    Integer expectedResult = 10;

    //Get max integer from menuTpList
    Integer max = menuTpList.stream().mapToInt(v -> v).max().orElseThrow(NoSuchElementException::new);;

    Assert.assertEquals(expectedResult, max, "Should be 10");
}

Related