小编典典

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

java

我想使用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()。

提前谢谢你的帮助!


阅读 863

收藏
2020-11-26

共1个答案

小编典典

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

  • 遍历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);
2020-11-26