1. 程式人生 > >Java工程中嵌入scala程式碼

Java工程中嵌入scala程式碼

今天我將介紹如何在Java工程使用Scala程式碼。對於那些想在真實場景中嘗試使用Scala的開發人員來說,會非常有意思。這和你專案中有什麼型別的東西毫無關係:不管是Spring還是Spark還是別的。我們廢話少說,開始吧。

抽象Java Maven項工程

  這裡我們使用Maven來管理我們的Java專案,專案的結果如下所示:


如果想及時瞭解Spark、Hadoop或者Hbase相關的文章,歡迎關注微信公共帳號:iteblog_hadoop

正如你所看到的,工程的結構非常簡單。它有標準的佈局和僅僅三個Java類,如下所示:

package com.iteblog.demo.model;

/**
 * User: 過往記憶
 * Date: 2016-12-30
 * Time: 下午23:16
 * bolg: https://www.iteblog.com
 * 本文地址:https://www.iteblog.com/archives/1947.html
 * 過往記憶部落格,專注於hadoop、hive、spark、shark、flume的技術部落格,大量的乾貨
 * 過往記憶部落格微信公共帳號:iteblog_hadoop
 */
public class Book {

    private String name = null;
    private String author = null;

    public Book(String name, String author) {
        this.name = name;
        this.author = author;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book {" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                '}';
    }
}

下面是所謂的資料儲存

package com.iteblog.demo.storage;

import com.iteblog.demo.model.Book;

import java.util.ArrayList;

/**
 * User: 過往記憶
 * Date: 2016-12-30
 * Time: 下午23:16
 * bolg: https://www.iteblog.com
 * 本文地址:https://www.iteblog.com/archives/1947.html
 * 過往記憶部落格,專注於hadoop、hive、spark、shark、flume的技術部落格,大量的乾貨
 * 過往記憶部落格微信公共帳號:iteblog_hadoop
 */
public class BookStorage {

    private ArrayList<Book> books = new ArrayList<>();

    public BookStorage() {
        books.add(new Book("White Fang", "Jack London"));
        books.add(new Book("The Sea-Wolf", "Jack London"));
        books.add(new Book("The Road", "Jack London"));
        books.add(new Book("The Adventures of Tom Sawyer", "Mark Twain"));
        books.add(new Book("Around the World in 80 Days", "Jules Verne"));
        books.add(new Book("Twenty Thousand Leagues Under the Sea", "Jules Verne"));
        books.add(new Book("The Mysterious Island", "Jules Verne"));
        books.add(new Book("The Four Million", "O. Henry"));
        books.add(new Book("The Last Leaf", "O. Henry"));
    }

    public ArrayList<Book> getBooks() {
        return books;
    }
}

最後是主類:

package com.iteblog.demo;

import com.iteblog.demo.storage.BookStorage;

/**
 * User: 過往記憶
 * Date: 2016-12-30
 * Time: 下午23:16
 * bolg: https://www.iteblog.com
 * 本文地址:https://www.iteblog.com/archives/1947.html
 * 過往記憶部落格,專注於hadoop、hive、spark、shark、flume的技術部落格,大量的乾貨
 * 過往記憶部落格微信公共帳號:iteblog_hadoop
 */
public class Runner {

    public static void main(String[] args) {
        BookStorage storage = new BookStorage();
        storage.getBooks().stream().forEach(System.out::println);
    }

}

最後別忘記我們還有個pom.xml檔案,它可能包含一些依賴,外掛和構建目標;不過這些並不重要。

Scala混合到Java Maven專案中

  為了能夠在Java Maven工程中使用Scala,我們需要使用一個Maven外掛:scala-maven-plugin,把下面的程式碼加入到pom.xml檔案中

<plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>scala-maven-plugin</artifactId>
    <executions>
        <execution>
            <id>scala-compile-first</id>
            <phase>process-resources</phase>
            <goals>
                <goal>add-source</goal>
                <goal>compile</goal>
            </goals>
        </execution>
        <execution>
            <id>scala-test-compile</id>
            <phase>process-test-resources</phase>
            <goals>
                <goal>testCompile</goal>
            </goals>
        </execution>
    </executions>
</plugin>

因為我們需要使用Scala程式碼,所以我們還需要加入scala-library依賴,如下:

<dependency>
    <groupId>org.scala-lang</groupId>
    <artifactId>scala-library</artifactId>
    <version>2.11.7</version>
</dependency>

最後完整的額pom.xml檔案內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.iteblog.demo</groupId>
    <artifactId>iteblog</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.scala-lang</groupId>
            <artifactId>scala-library</artifactId>
            <version>2.11.7</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!-- This plugin compiles Scala files -->
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>scala-compile-first</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>add-source</goal>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>scala-test-compile</id>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- This plugin compiles Java files -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
                <executions>
                    <execution>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <!-- This plugin adds all dependencies to JAR file during 'package' command.
            Pay EXTRA attention to the 'mainClass' tag.
            You have to set name of class with entry point to program ('main' method) -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.5.3</version>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>ScalaRunner</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

        </plugins>
    </build>

</project>

更新完上面的內容之後,你需要等待Maven下載完所有的依賴。

  現在我們可以在Java工程中使用Scala程式碼了。為此,您需要建立新的資料夾src/main/scala;Scala Maven外掛將會識別這些目錄,並且編譯其中的Scala檔案:
現在我們在工程裡面加入Scala程式碼:

package com.iteblog.service

import java.util

import com.iteblog.demo.model.Book
import scala.collection.JavaConversions._

/**
 * User: 過往記憶
 * Date: 2016-12-30
 * Time: 下午23:16
 * bolg: https://www.iteblog.com
 * 本文地址:https://www.iteblog.com/archives/1947.html
 * 過往記憶部落格,專注於hadoop、hive、spark、shark、flume的技術部落格,大量的乾貨
 * 過往記憶部落格微信公共帳號:iteblog_hadoop
 */
object BooksProcessor {

  def filterByAuthor(author: String)(implicit books: util.ArrayList[Book]) = {
    books.filter(book => book.getAuthor == author)
  }

}

現在我們可以在Scala程式碼中遍歷相關的圖書了:

import com.iteblog.demo.storage.BookStorage
import com.iteblog.service.BooksProcessor

/**
 * User: 過往記憶
 * Date: 2016-12-30
 * Time: 下午23:16
 * bolg: https://www.iteblog.com
 * 本文地址:https://www.iteblog.com/archives/1947
 * 過往記憶部落格,專注於hadoop、hive、spark、shark、flume的技術部落格,大量的乾貨
 * 過往記憶部落格微信公共帳號:iteblog_hadoop
 */
object ScalaRunner extends App {

  implicit val books = new BookStorage().getBooks
  BooksProcessor.filterByAuthor("Jack London").foreach(b => println(b))

}

最後加入Scala程式碼的工程看起來如下:


如果想及時瞭解Spark、Hadoop或者Hbase相關的文章,歡迎關注微信公共帳號:iteblog_hadoop

執行ScalaRunner程式碼得到下面的結果:

Book {name='White Fang', author='Jack London'}
Book {name='The Sea-Wolf', author='Jack London'}
Book {name='The Road', author='Jack London'}

本部落格文章除特別宣告,全部都是原創!
轉載本文請加上:轉載自過往記憶(https://www.iteblog.com/)
本文連結: 【如何在Java Maven工程中編寫Scala程式碼】(https://www.iteblog.com/archives/1947