当前位置: 首页 > 知识库问答 >
问题:

Java8流API min()和max()vs收集器minBy()和maxBy()[重复]

戈念
2023-03-14

在java 8中,流API帮助我们以非常干净和更少的代码完成工作。我是这些流API的忠实粉丝。但是很少有操作能够帮助解决同一类型的问题,也不确定何时使用哪种操作,虽然在两者之间进行选择并不困难,但只想知道任何一种操作都有针对这些操作的特定用例。我所说的操作是:-

中间操作:-最小值和最大值

终端操作:collectcollectorclass strategy usingminByandmaxBy

List<String> randomString= Arrays.asList("AA","AAA","A","AAAA","AAAAAA","AAAAAAAAAAAAAAAAAA");
String maxByIntermediateMax = randomString.stream().max(String :: compareTo).get();
String minByIntermediateMin = randomString.stream().min(String :: compareTo).get();
System.out.println("Intermediate Min() :- "+minByIntermediateMin+" Intermeidate Max() :- "+ maxByIntermediateMax);
String minByCollectorsMinBy = randomString.stream().collect(Collectors.minBy(Comparator.naturalOrder())).get();
String maxByCollectorsMaxBy = randomString.stream().collect(Collectors.maxBy(Comparator.naturalOrder())).get();
System.out.println("Collectors MinBy :- "+minByCollectorsMinBy+ " , Collectors maxBy is :- "+maxByCollectorsMaxBy);

输出

Intermediate Min() :- A Intermeidate Max() :- AAAAAAAAAAAAAAAAAA
Collectors MinBy :- A , Collectors maxBy is :- AAAAAAAAAAAAAAAAAA

共有3个答案

宰父冠玉
2023-03-14

<代码>流。最小值和流。max是终端操作。javadoc明确指出了这一点。

这两者之间的相似性是您在问题中提到的。它们都使用BinaryOperator.minBy(比较器)对元素执行缩减操作(尽管缩减方式的实现略有不同)。

因此,代码中的输出没有变化。由于需要在所有流元素中找到最小/最大值,我建议使用stream。因为代码看起来很整洁,而且在这种情况下也不需要创建收集器。

但也有一些情况下,收集器。需要使用minBy。假设您需要对元素进行分组,并需要在每组中找到最小/最大值。在这种情况下,您不能使用流。最小值。这里需要使用收集器。groupingBy(映射器、收集器、minBy(…)) 。类似地,您可以将其用于分区方式(partitionBy)和其他需要收集器的类似方法。

罗昊明
2023-03-14
匿名用户

使用流()。max有效地生成与stream()相同的结果。collect(Collectors.maxBy)。这同样适用于stream()。最小值和流()。收集(Collectors.minBy)

虽然结果相同,但这两种方法在可读性和灵活性方面存在一些细微的差异。

通过使用收集器,您可以使用任何返回可选的收集器

 List<String> randomString= Arrays.asList("AA","AAA","A","AAAA","AAAAAA","AAAAAAAAAAAAAAAAAA");
 Collector<String, ?, Optional<String>> collectorMin = Collectors.minBy(Comparator.naturalOrder());
 Collector<String, ?, Optional<String>> collectorMax = Collectors.minBy(Comparator.naturalOrder());
    
     
    String collectedMin= randomString.stream().collect(collectorMin ).get();
    String collectedMax= randomString.stream().collect(collectorMax ).get();

另一方面,流()。最大流()。min更具可读性,更不冗长。

巫马瀚漠
2023-03-14

Stream#min的JavaDoc说min是一个终端操作,所以. Collection(Collectors.minBy(...)). min(...)是可以互换的。

对我来说,minmax具有更具可读性的语法,但收集更通用,因此作为示例,您可以传递min/max收集器作为您的方法的参数。

 类似资料:
  • 我想获取地图的值,找到min值,并为地图的每个条目构造一个新的CodesWitMinValue实例。我希望使用Java11个流,我可以在多行中使用多个流(一个用于min值,一个用于转换)来实现这一点。是否可以使用java 11流和收集器在单行中实现?谢谢。

  • 本文向大家介绍浅谈JAVA8给我带了什么——流的概念和收集器,包括了浅谈JAVA8给我带了什么——流的概念和收集器的使用技巧和注意事项,需要的朋友参考一下 到现在为止,笔者不敢给流下定义,从概念来讲他应该也是一种数据元素才是。可是在我们前面的代码例子中我们可以看到他更多的好像在表示他是一组处理数据的行为组合。这让笔者很难去理解他的定义。所以笔者不表态。各位同志自行理解吧。 在没有流以前,处理集合里

  • 我有一个对象的集合,每个对象都有一个元素的集合,例如: 如何使用Java 8函数式编程来过滤和收集类型等于“a”的集合? 我尝试了以下方法: 但我得到以下错误: 变量'filteredChildren'初始值设定项'parents。stream()。forEach(p- 如何按类型筛选嵌套集合并收集它们?

  • 注意:这个问题源自一个死的链接,这是以前的一个SO问题,但这里是... 看到这段代码(注意:我确实知道这段代码不会“工作”,应该使用--我只是从链接的问题中提取出来的): 根据和的javadoc,两者的参数都应该是一个。然而,这里的方法引用是类的静态方法。

  • 有没有办法把这两条流合并成一条?我使用第一个流在嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以用一条流来实现这一点。 像这样的

  • 什么时候使用和?有没有人有好的、具体的例子来说明什么时候走一条路或者走另一条路更好呢? Javadoc提到collect()是一个可变约简。 以上的说法是猜测,然而,我希望一个专家在这里插话。