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

Kok*_*fuu 2 java methods max java-8 java-stream

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

结构如下:

  • 我读了一个csv文件,并将每行的数据存储在一个单独的类型对象中Round.
  • 所有这些Round对象都存储在一个ArrayList被调用的中arrRound
  • 所有Round对象都有一个字段:List<Hit> hits
  • a Hit由2个字段组成:int numberOfGamesint prizeAmount
public class Round{
    private List<Hits> hits; 
}
public class Hits{
    private int numberOfGames;
    private int prizeAmount;
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是迭代所有元素arrRound,获取他们的命中字段的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());
                                });
    }
}
Run Code Online (Sandbox Code Playgroud)

而且我无法在声明的末尾调用max().

提前谢谢你的帮助!

azr*_*zro 6

你可以通过这种方式实现它:

  • 迭代Roundlist
  • Round对象变为它List<Hit> hits,
  • 使用flatMap从去Stream<List<Hits>>Stream<Hits>
  • 改变Hits到它的prizeAmount领域
  • 得到maxif存在
  • 如果没有最大值(如果列表为空或其他)返回 -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
Run Code Online (Sandbox Code Playgroud)

与班级lambdamap + flatMap一个:

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

  • 更可读的解决方案 - >`int maxPrize = arrRound.stream().map(Round :: getHits).flatMap(List :: stream).mapToInt(Hit :: getPrizeAmount).max().orElse(-1) ;`.虽然,是否优先使用方法参考;-) (2认同)