这是我的代码
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))
来查找具有最大值的点,x
而Point
其本身没有自然顺序。或者做类似的事情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
因为String
s 的自然顺序是字典顺序,其中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