当前位置: 首页 > 面试题库 >

在Java中使用Lambda表达式查找Max

仉臻
2023-03-14
问题内容

这是我的代码

    List<Integer> ints = Stream.of(1,2,4,3,5).collect(Collectors.toList());
    Integer maxInt = ints.stream()
                              .max(Comparator.comparing(i -> i))
                              .get();

    System.out.println("Maximum number in the set is " + maxInt);

输出:

Maximum number in the set is 5

我无法i在我的代码的以下部分中区分两者

Comparator.comparing(i -> i)

有人能和be并解释两者的区别i吗?


问题答案:

该方法Comparator.comparing(…)旨在创建一个Comparator使用基于对象属性的订单进行比较的。当使用lambda表达式i -> i(这是(int i) -> { return i; }此处的简短写法)作为属性提供程序函数时,结果Comparator将比较值本身。这工作时,要比较的对象有一个 自然秩序Integer了。

所以

Stream.of(1,2,4,3,5).max(Comparator.comparing(i -> i))
.ifPresent(maxInt->System.out.println("Maximum number in the set is " + maxInt));

与…相同

Stream.of(1,2,4,3,5).max(Comparator.naturalOrder())
.ifPresent(maxInt->System.out.println("Maximum number in the set is " + maxInt));

尽管后者更有效,因为它对于具有自然顺序的所有类型都实现为单例(和实现Comparable)。

根本max不需要a 的原因Comparator是因为您使用的泛型类Stream可能包含任意对象。

这允许(例如)使用它streamOfPoints.max(Comparator.comparing(p->p.x))来查找具有最大值的点,xPoint其本身没有自然顺序。或者做类似的事情streamOfPersons.sorted(Comparator.comparing(Person::getAge))

使用专家时,IntStream您可以直接使用自然顺序,这可能会更有效:

IntStream.of(1,2,4,3,5).max()
.ifPresent(maxInt->System.out.println("Maximum number in the set is " + maxInt));

为了说明“自然顺序”与基于属性的顺序之间的区别:

Stream.of("a","bb","aaa","z","b").max(Comparator.naturalOrder())
.ifPresent(max->System.out.println("Maximum string in the set is " + max));

这将打印

集合中的最大字符串为z

因为Strings 的自然顺序是字典顺序,其中z大于b大于大于a

另一方面

Stream.of("a","bb","aaa","z","b").max(Comparator.comparing(s->s.length()))
.ifPresent(max->System.out.println("Maximum string in the set is " + max));

将打印

集合中的最大字符串为aaa

如流中所有s aaa的最大
长度String。这是一个预期的用例,Comparator.comparing使用方法引用时可以使其更具可读性,即Comparator.comparing(String::length)几乎可以说明一切……



 类似资料:
  • 主要内容:作为参数使用Lambda表达式,访问变量,方法引用在《 Java Lambda表达式》和《 Java Lambda表达式的3种简写方式》一节中我们了解了 Java Lambda 的概念并可以在匿名类的场合使用 Lambda 语法进行简单替换。本节主要介绍在 Java 中如何使用 Lambda 表达式。 作为参数使用Lambda表达式 Lambda 表达式一种常见的用途就是作为参数传递给方法,这需要声明参数的类型声明为函数式接口类型。示例代码如下:

  • 我知道使用lambda expression(LE)我们可以节省一些代码行,比如为函数接口创建对象。而且LE将更易读。但我确信这并不是提供该功能的主要原因。我在google上搜索,并在本文中找到了这段有趣的引用 在Java8之前,处理任何集合的元素都可以通过从集合中获取迭代器,然后迭代元素,然后处理每个元素来完成。如果需要并行处理这些元素,那么将由客户端代码完成。随着Java 8中Stream A

  • 问题内容: Java8中添加了Lambda表达式。我想理解为什么这很重要。对于尚未接触函数式编程习惯的Java程序员意味着什么?这是否意味着我可以编写出性能更好的代码或可大规模扩展的代码,还是只会使代码的详细程度降低。或全部。 问题答案: Oracle已经提供了有关该主题的教程。它列出了几个很好的用例。 在找到链接之前,我要说的是lambda表达式可让您将“函数”传递给代码。因此,您可以更轻松地编

  • 主要内容:函数式接口Lambda 表达式(Lambda expression)是一个匿名函数,基于数学中的λ演算得名,也可称为 闭包(Closure)。现在很多语言都支持 Lambda 表达式,如 C++、 C#、 Java、 Python 和 JavaScript 等。 Lambda 表达式是推动 Java 8 发布的重要新特性,它允许把函数作为一个方法的参数(函数作为参数传递进方法中),下面通过例 1 来理解 L

  • 我还在尝试理解lambda表达式。 我想将这个lambda表达式转换为“普通”表达式: 你们有主意吗? 提前谢谢。

  • 本文向大家介绍Java中使用Lambda表达式实现IntBinaryOperator,包括了Java中使用Lambda表达式实现IntBinaryOperator的使用技巧和注意事项,需要的朋友参考一下 IntBinaryOperator 是Java 8 中java.util.function包中的功能接口。该接口需要两个int类型的参数作为输入, 并产生一个int类型的结果。IntBinaryO