scala集合中加入集合
这篇文章包含有关Scala收藏的一些信息。
问题?
我们需要一个函数,该函数将以“橄榄球运动员列表”作为输入,并返回那些为伦斯特效力并且可以从最快到最慢跑100米的球员的名字。
步骤1:代表橄榄球运动员。
好的,所以很明显,我们想要像POJO这样的东西来代表橄榄球运动员。 这个
表示形式应该有一个球员的姓名,他们的球队和可以进入100米的时间。让我们使用Scala案例类构造
这消除了对样板代码的需要。
case class RugbyPlayerCaseClass(team: String, sprintTime100M: BigDecimal, name: String)
第2步:创建一些橄榄球运动员
val lukeFitzGerald = RugbyPlayerCaseClass('Leinster', 10.2, 'Luke Fitzgerald');
val fergusMcFadden = RugbyPlayerCaseClass('Leinster', 10.1, 'Fergus McFadden');
val rog = RugbyPlayerCaseClass('Leinster', 12, 'Ronan O'Gara');
val tommyBowe = RugbyPlayerCaseClass('Ulster', 10.3, 'Tommy Bowe');
val leoCullen = RugbyPlayerCaseClass('Leinster', 15, 'Leo Cullen');
上面的代码应该可以自我解释。 实例化了各种橄榄球运动员。 请注意推断的类型。 无需将任何橄榄球运动员声明为RugbyPlayers类型。 相反,它是推断的。 另一件有趣的事情是使用了关键字val
。 这意味着引用是不可变的,等效于Java中的final
。
第三步:编写函数
def validByAge(in: List[RugbyPlayerCaseClass]) =
in.filter(_.team == 'Leinster').sortWith(_.sprintTime100M < _.sprintTime100M).map(_.name);
有关此功能的要点:
- 该函数以
def
关键字开头,表示函数声明。 - 将输入RugbyPlayerCaseClass实例列表。 列表类型是Scala类型。
- 返回类型是可选的。 在这种情况下,由于推断没有明确指定。
- =左边的部分是函数的作用。 在这种情况下,该函数将调用三个差异收集运算符 。
.filter(_.team =='Leinster)
–迭代列表中的每个元素。
- 函数主体不需要用{}包围,因为它只是一个行代码。
- 不需要返回语句。 在Scala中,最后一行计算得出的结果都将被返回。 在此示例中,由于只有一行,所以最后一行是第一行。
最后–全部放在一起。
object RugbyPlayerCollectionDemos {
def main(args: Array[String]){
println('Scala collections stuff!');
showSomeFilterTricks();
}
// Case class remove need for boiler plater code.
case class RugbyPlayerCaseClass(team: String, sprintTime100M: BigDecimal, name: String)
def showSomeFilterTricks() {
// team: String, sprintTime100M: Int, name: String
val lukeFitzGerald = RugbyPlayerCaseClass('Leinster', 10.2, 'Luke Fitzgerald');
val fergusMcFadden = RugbyPlayerCaseClass('Leinster', 10.1, 'Fergus McFadden');
val rog = RugbyPlayerCaseClass('Munster', 12, 'Ronan O'Gara');
val tommyBowe = RugbyPlayerCaseClass('Ulster', 10.3, 'Tommy Bowe');
val leoCullen = RugbyPlayerCaseClass('Leinster', 15, 'Leo Cullen');
println(validByAge(List(lukeFitzGerald, fergusMcFadden, rog, tommyBowe, leoCullen)));
}
def validByAge(in: List[RugbyPlayerCaseClass]) =
in.filter(_.team == 'Leinster').sortWith(_.sprintTime100M < _.sprintTime100M).map(_.name);
}
上面的程序将输出:
Scala collections stuff!
List(Luke Fitzgerald, Fergus McFadden, Leo Cullen)
在Java Pre Java 8中,要在Java中实现相同的功能,可能需要花费更多的代码。
public class RugbyPLayerCollectionDemos {
public static void main(String args[]) {
RugbyPLayerCollectionDemos collectionDemos = new RugbyPLayerCollectionDemos();
collectionDemos.showSomeFilterTricks();
}
public void showSomeFilterTricks() {
// team: String, sprintTime100M: Int, name: String
final RugbyPlayerPOJO lukeFitzGerald = new RugbyPlayerPOJO('Leinster', new BigDecimal(10.2), 'Luke Fitzgerald');
final RugbyPlayerPOJO fergusMcFadden = new RugbyPlayerPOJO('Leinster', new BigDecimal(10.1), 'Fergus McFadden');
final RugbyPlayerPOJO rog = new RugbyPlayerPOJO('Munster', new BigDecimal(12), 'Ronan O'Gara');
final RugbyPlayerPOJO tommyBowe = new RugbyPlayerPOJO('Ulster', new BigDecimal(10.3), 'Tommy Bowe');
final RugbyPlayerPOJO leoCullen = new RugbyPlayerPOJO('Leinster', new BigDecimal(15), 'Leo Cullen');
List
rugbyPlayers = Arrays.asList(lukeFitzGerald,
fergusMcFadden, rog, tommyBowe, leoCullen);
System.out.println(filterRugbyPlayers(rugbyPlayers));
}
/**
* Return the names of Leinster Rugby players in the order of their sprint times.
*/
public List
filterRugbyPlayers(List
pojos) {
ArrayList
leinsterRugbyPlayers = new ArrayList
();
for (RugbyPlayerPOJO pojo: pojos) {
if (pojo.getTeam().equals('Leinster')) {
leinsterRugbyPlayers.add(pojo);
}
}
RugbyPlayerPOJO [] rugbyPlayersAsArray = leinsterRugbyPlayers.toArray(new RugbyPlayerPOJO[0]);
Arrays.sort(rugbyPlayersAsArray, new Comparator
() {
public int compare(RugbyPlayerPOJO rugbyPlayer1, RugbyPlayerPOJO rugbyPlayer2) {
return rugbyPlayer1.getSprintTime100M().compareTo(rugbyPlayer2.getSprintTime100M());
}
});
List
rugbyPlayersNamesToReturn = new ArrayList
();
for (RugbyPlayerPOJO rugbyPlayerPOJO: rugbyPlayersAsArray) {
rugbyPlayersNamesToReturn.add(rugbyPlayerPOJO.getName());
}
return rugbyPlayersNamesToReturn;
}
class RugbyPlayerPOJO {
private BigDecimal sprintTime100M;
private String team;
private String name;
public RugbyPlayerPOJO(String team, java.math.BigDecimal sprintTime100M, String name) {
this.name = name;
this.sprintTime100M = sprintTime100M;
this.team = team;
}
public BigDecimal getSprintTime100M() {
return sprintTime100M;
}
public String getTeam() {
return team;
}
public String getName() {
return name;
}
}
}
Java 8有帮助吗?
是。 根据Project Lambda规范, Java 8将具有相似的外观过滤器,映射和排序功能。 Java 8这篇文章中的功能如下所示:
List
rugbyPlayers = Arrays.asList(lukeFitzGerald,
fergusMcFadden, rog, tommyBowe, leoCullen);
//...
//...
List
filteredPLayersNames = rugbyPlayers.filter(e -> e.getTeam.equals('Leinster')).
sorted((a, b) -> a.getSprintTime100M() - b.getSprintTime100M()).mapped(e -> {return e.getName();}).into(new List<>());
因此,Java 8在这方面无疑正在迎头赶上。 但是就足够了吗?
参考: Scala:来自都柏林技术博客博客的JCG合作伙伴 Alex Staveley的Collections 1 。
翻译自: https://www.javacodegeeks.com/2013/01/scala-collections-1.html
scala集合中加入集合