我必须用流api编写一个方法。在方法中我应该在一个名为“Winner”的Object中得到一个整数值的最大值,我的意思是整数值是平均速度值,我必须得到最高/最快的一个。班级看起来像这样
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;
}
}
我试过这个,但我仍然得到3个名字,我不知道为什么
private static Double getMaxAVGSpeed() {
return Winner.tdfWinners
.stream()
.mapToDouble(Winner::getAveSpeed)
.max()
.orElse(Double.MAX_VALUE);
}
private static String winnerAVGSpeed() {
return Winner.tdfWinners
.stream()
.filter(winner -> winner.getAveSpeed() == getMaxAVGSpeed())
.map(Winner::getName)
.collect(Collectors.joining());
}
我希望你们能提供帮助。
此致,Lukas
答案 0 :(得分:1)
编辑:在阅读了Mark Keen的评论之后,似乎主要的错误是getAveSpeed()
函数没有将长度转换为double,因此结果是四舍五入的。查看代码时我错过了。如果练习按原样提供Winner
课程,我会问周围确保这是预期的行为。然而,最可能的情况是类的方法是由OP编写的,在这种情况下,计算是一个必要的改变。谢谢,马克。
当我运行你的代码时,我实际上得到了6个名字。
你的问题是6名获胜者的平均速度为40.0,这是该组中最快/最高的一名。所以你得到的结果是正确的。您遇到的主要问题是找出练习的要求,看看是否必须打印出最大速度,最高速度的获胜者名称,或者只有一个具有最大速度的名称。
关于您的代码的一个小警告,在winnerAVGSpeed()
函数中,您编写
.filter(winner -> winner.getAveSpeed() == getMaxAVGSpeed())
在您正在操作的流上。您正在为流中的每个元素调用getMaxAVGSpeed()
,这意味着您将浏览流并为列表的每个元素计算一次最大速度。问题是,最大平均速度在任何时候都不会改变,因此您可以在开始操作流之前计算一次,将其存储在变量中,然后使用变量,以提高代码效率。
如果您只需要打印出具有最大速度的单个名称,您也可以使用reduce
在单个流操作中执行此操作,这是一个允许您比较和缩小流的流函数使用自定义函数的单个元素。这里有official documentation,但您也可以找到许多关于如何在流上使用reduce
的不同教程。但这并不是必要的,你的方式对我来说似乎更加清晰和有用。