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

使用Java 8流方法获取最大值

羊舌源
2023-03-14
问题内容

我想使用java 8流方法从列表中获取最大值。

结构如下:

  • 我读取了一个csv文件,并将每一行的数据存储在一个单独的type对象中Round
  • 所有这些Round对象都存储在一个ArrayList名为arrRound
  • 所有Round对象都有一个字段:List<Hit> hits
  • a Hit包含2个字段:int numberOfGamesint prizeAmount

    public class Round{
    private List hits;
    }
    public class Hits{
    private int numberOfGames;
    private int prizeAmount;
    }

我想做的是迭代的所有元素arrRound,获取hits字段的getPrizeAmount()方法,并从中获取最大价值。我从以下步骤开始,但似乎无法做到:

public class Main(){
    public void main(String[]args){
        List<Round> arrRound = getRoundFromCSV();
        int maxPrize = arrRound.stream()
                               .forEach(round -> {
                                 round.getHits()
                                      .forEach(hit -> hit.getPrizeAmount());
                                });
    }
}

而且我无法在语句末尾调用max()。

提前谢谢你的帮助!


问题答案:

您可以通过以下方式实现它:

  • 遍历Roundlist
  • Round对象更改为List<Hit> hits
  • 使用flatMap从去Stream<List<Hits>>Stream<Hits>
  • 从转换Hits到其prizeAmount领域
  • 得到max如果存在
  • 如果没有最大值(如列表为空或其他),则返回 -1

所以使用 Method reference

int maxPrize = arrRoundarrRound.stream()                      // Stream<Round>
                               .map(Round::getHits)           // Stream<List<Hits>>
                               .flatMap(List::stream)         // Stream<Hits>
                               .mapToInt(Hit::getPrizeAmount) // IntStream
                               .max()                         // OptionalInt 
                               .orElse(-1);                   // int

带班lambdamap + flatMap一个:

int maxPrize = arrRoundarrRound.stream()    
                               .flatMap(round -> round.getHits().stream())
                               .mapToInt(hits -> hits.getPrizeAmount())
                               .max()                         
                               .orElse(-1);


 类似资料:
  • 我想用Java8lambda表达式在java列表中找到max值,所以,我有一个类叫TicketMaster,项表是TicketMasterLog,在TicketMasterLog类中我有StatusMaster类的statusId引用列,所以这里我想在TicketMasterLog列表中找到max statusId,下面我给出我的代码请参考 而TicketMasterItem表是 因此,在列表中,

  • 问题内容: 是否有一种简洁的方法可以一次性提取流的最小值和最大值(基于某个比较器)? 似乎有很多方法可以分别获取最小值和最大值,或者我可以将流分类为一个临时对象,例如: 但这并不简洁,需要分配一个临时对象。我宁愿不分配一个临时对象,也不希望两次通过流。有其他选择吗? 问题答案: 如果这是经常需要的功能,我们最好做一个。我们将需要一个类来保存,并需要使用工厂方法来创建统计收集器。 (也许更好的便捷方

  • 是否有一种简洁的方法可以在一次过程中提取流的最小值和最大值(基于某个比较器)? 似乎有很多方法可以单独获取最小值和最大值,或者我可以将流排序为临时对象,例如: 但这并不简洁,需要分配一个临时对象。我宁愿不要分配一个临时对象,也不要在流中进行两次传递。有其他选择吗?

  • 如何将键字符串格式化为,只有周、月和年作为流的输出? 数据集: 这可能不是初始化和格式化的正确方式,因此请注意。这只是地图中实际数据的一小部分。 预期产出: 以下是打印地图时的预期输出:[年/月/年的周数=分组周值中的最高值]

  • 我有一个hashmap,看起来像这样: 我的ImageRecipeMap对象如下所示: 我想获取所有ImageID列表,并使用Java8流创建一个总的ImageID列表。到目前为止,这就是我所拥有的,但我的collect上似乎有一个编译错误: