scala集合中加入集合_Scala:集合1

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集合中加入集合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值