Java 8 Stream得到最少

时间:2018-03-04 01:52:36

标签: java java-8 java-stream

我必须用流api编写一个方法。在方法中我应该在一个名为“Winner”的对象中获得最小值的整数值,我的意思是整数值是lengthKm值,我必须得到最低值/最短的一个。班级看起来像这样

package U13_Lambdas_Streams.Streams;

import java.time.Duration;
import java.util.Arrays;
import java.util.List;

public class Winner {

    private int year;
    private String nationality;
    private String name;
    private String team;
    private int lengthKm;
    private Duration winningTime;
    private int stageWins;
    private int daysInYellow;

    public static final List<Winner> tdfWinners = Arrays.asList(
            new Winner(2006, "Spain", "Óscar Pereiro", "Caisse d'Epargne–
    Illes Balears", 3657, Duration.parse("PT89H40M27S"), 8),
            new Winner(2007, "Spain", "Alberto Contador", "Discovery 
    Channel", 3570, Duration.parse("PT91H00M26S"), 4),
            new Winner(2008, "Spain", "Carlos Sastre", "Team CSC", 3559, 
    Duration.parse("PT87H52M52S"), 5),
            new Winner(2009, "Spain", "Alberto Contador", "Astana", 3459, 
    Duration.parse("PT85H48M35S"), 7),
            new Winner(2010, "Luxembourg", "Andy Schleck", "Team Saxo Bank",
    3642, Duration.parse("PT91H59M27S"), 12),
            new Winner(2011, "Australia", "Cadel Evans", "BMC Racing Team", 
    3430, Duration.parse("PT86H12M22S"), 2),
            new Winner(2012, "Great Britain", "Bradley Wiggins", "Team Sky", 
    3496, Duration.parse("PT87H34M47S"), 14),
            new Winner(2013, "Great Britain", "Chris Froome", "Team Sky",
    3404, Duration.parse("PT83H56M20S"), 14),
            new Winner(2014, "Italy", "Vincenzo Nibali", "Astana", 3661, 
    Duration.parse("PT89H59M06S"), 19),
            new Winner(2015, "Great Britain", "Chris Froome", "Team Sky",
    3360, Duration.parse("PT84H46M14S"), 16),
            new Winner(2016, "Great Britain", "Chris Froome", "Team Sky",             
    3529, Duration.parse("PT89H04M48S"), 14)
    );


    public Winner(int year, String nationality, String name, String team, int
          lengthKm, Duration winningTime, int daysInYellow) {
        this.year = year;
        this.nationality = nationality;
        this.name = name;
        this.team = team;
        this.lengthKm = lengthKm;
        this.winningTime = winningTime;
        this.daysInYellow = daysInYellow;
    }

    public double getAveSpeed() {
        return (getLengthKm() / (getWinningTime().getSeconds() / 3600));
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getNationality() {
        return nationality;
    }

    public void setNationality(String nationality) {
        this.nationality = nationality;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getTeam() {
        return team;
    }

    public void setTeam(String team) {
        this.team = team;
    }

    public int getLengthKm() {
        return lengthKm;
    }

    public void setLengthKm(int lengthKm) {
        this.lengthKm = lengthKm;
    }

    public Duration getWinningTime() {
        return winningTime;
    }

    public void setWinningTime(Duration winningTime) {
        this.winningTime = winningTime;
    }

    public int getStageWins() {
        return stageWins;
    }

    public void setStageWins(int stageWins) {
        this.stageWins = stageWins;
    }

    public int getDaysInYellow() {
        return daysInYellow;
    }

    public void setDaysInYellow(int daysInYellow) {
        this.daysInYellow = daysInYellow;
    }

    @Override
    public String toString() {
        return name;
    }
}

我试图收集以太的东西然后得到最低限度。然而它没有像计划那样工作。 这就是我现在能帮到你的东西吗?

 private static int GetShortestTour() {
    List<Integer> values = Winner.tdfWinners.stream()
            .filter(winner -> winner.getLengthKm())
            .collect(Collectors.toList());
    return ;

我知道我什么都不能回报,但我不知道如何从列表中获得最低限度或如何直接回馈。

2 个答案:

答案 0 :(得分:7)

您似乎在滥用Stream提供的方法,可能忘记您可以将其映射到IntStream,然后致电min以返回OptionalInt

private static int getShortestTour() {
    return Winner.tdfWinnders
                 .stream()
                 .mapToInt(Winner::getLengthKm)
                 .min()
                 .orElse(Integer.MIN_VALUE);
}

如果未找到最小值,则返回Integer.MIN_VALUE

答案 1 :(得分:0)

请在方法中使用以下内容,

int min = tdfWinners.stream()
                    .mapToInt(k -> k.lengthKm)
                    .min()
                    .orElse(0);