`
lobin
  • 浏览: 383406 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Scala

 
阅读更多
写道

 

写道

 

语法

Expr1 ::= ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’) 

                     {nl} [‘yield’] Expr 

 

Enumerators ::= Generator {semi Generator} 

 

Generator ::= Pattern1 ‘<-’ Expr {[semi] Guard | semi Pattern1 ‘=’ Expr} 

 

Guard ::= ‘if’ PostfixExpr

 

 

 

例子

ForTest.scala

object ForTest extends App {

    var begin: Int = 1;

    var end : Int = 10;

    for (i <- begin until end) 

        println(i);

}

编译

>scalac -d classes ForTest.scala

执行

>scala ForTest

1

2

3

4

5

6

7

8

9

 

 

例子

ForTest2.scala

object ForTest2 extends App {

    var begin: Int = 1;

    var end : Int = 10;

    for {i <- begin until end

         j <- 1 until i}

        println("(" + i + "," + j + ")");

}

编译

>scalac -d classes ForTest2.scala

执行

>scala ForTest2

(2,1)

(3,1)

(3,2)

(4,1)

(4,2)

(4,3)

(5,1)

(5,2)

(5,3)

(5,4)

(6,1)

(6,2)

(6,3)

(6,4)

(6,5)

(7,1)

(7,2)

(7,3)

(7,4)

(7,5)

(7,6)

(8,1)

(8,2)

(8,3)

(8,4)

(8,5)

(8,6)

(8,7)

(9,1)

(9,2)

(9,3)

(9,4)

(9,5)

(9,6)

(9,7)

(9,8)

 

 

 

 

 

 

 

 

 

例子

ForTest3.scala

object ForTest3 extends App {

    var matrix = Array(1, 2, 3, 4, 5)

    for (i <- matrix)

        println(i);

}

编译

>scalac -d classes ForTest3.scala

执行

>scala ForTest3

1

2

3

4

5

 

 

 

 

 

 

 

 

 

 

例子

ForTest4.scala

object ForTest4 extends App {

    var matrix = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    for (i <- matrix

         if i % 2 == 0)

        println(i);

}

编译

>scalac -d classes ForTest4.scala

执行

>scala ForTest4

2

4

6

8

10

 

scala currying

object CurryingTest {

  def summary() {
  	println("---summary start---")
  	println("--- summary end ---")
  }
  
  def details() {
    println("---start usage start---")
  	println("--- start usage end ---")
  	
  	println("---restart usage start---")
  	println("--- restart usage end ---")
  	
  	println("---stop usage start---")
  	println("--- stop usage end ---")
  	
  	println("---status usage start---")
  	println("--- status usage end ---")
  }
  
  def usage[T](summary: => T)(details: => T): Unit = {
    println("---usage start---")
    summary
    println("-----------------")
    
    details
    println("--- usage end ---")
  }

  def main(args: Array[String]) {
  	usage(summary())(details())
  }
}


>scalac -d classes  CurryingTest.scala

>scala CurryingTest

---usage start---
---summary start---
--- summary end ---
-----------------
---start usage start---
--- start usage end ---
---restart usage start---
--- restart usage end ---
---stop usage start---
--- stop usage end ---
---status usage start---
--- status usage end ---
--- usage end ---

 

object CurryingTest {

  def summary() {
  	println("---summary start---")
  	println("--- summary end ---")
  }
  
  def details() {
    println("---start usage start---")
  	println("--- start usage end ---")
  	
  	println("---restart usage start---")
  	println("--- restart usage end ---")
  	
  	println("---stop usage start---")
  	println("--- stop usage end ---")
  	
  	println("---status usage start---")
  	println("--- status usage end ---")
  }
  
  def usage[T](summary: => T)(details: => T): Unit = {
    println("---usage start---")
    summary
    println("-----------------")
    
    
    details
    println("--- usage end ---")
  }

  def main(args: Array[String]) {
  	usage(summary())(details())
  	println("=================")
  	
  	usage(summary()) {
      println("===start usage start===")
  	  println("=== start usage end ===")
  	
  	  println("===restart usage start===")
  	  println("=== restart usage end ===")
  	
  	  println("===stop usage start===")
  	  println("=== stop usage end ===")
  	
  	  println("===status usage start===")
  	  println("=== status usage end ===")
    }
  }
}



>scalac -d classes  CurryingTest.scala

>scala CurryingTest

---usage start---
---summary start---
--- summary end ---
-----------------
---start usage start---
--- start usage end ---
---restart usage start---
--- restart usage end ---
---stop usage start---
--- stop usage end ---
---status usage start---
--- status usage end ---
--- usage end ---
=================
---usage start---
---summary start---
--- summary end ---
-----------------
===start usage start===
=== start usage end ===
===restart usage start===
=== restart usage end ===
===stop usage start===
=== stop usage end ===
===status usage start===
=== status usage end ===
--- usage end ---

scala currying-例子3

def swallow(log: (Object, Throwable) => Unit, action: => Unit) {
  try {
    action
  } catch {
    case e: Throwable => log(e.getMessage(), e)
  }
}

 

 

scala break

import org.junit.{Before, BeforeClass, Test}
import org.scalatest.junit.JUnitSuite

import scala.util.control.{Breaks, ControlThrowable}

private class BreakControl extends ControlThrowable

object ScalaBreaksTest {
  @BeforeClass
  def _init : Unit = {

  }
}

class ScalaBreaksTest extends JUnitSuite {

  private val breakException = new BreakControl

  def init : Unit = ScalaBreaksTest._init

  @Before
  def inittest() : Unit = {}

  @Test
  def test1() : Unit = {
    var i: Int = 0
    try {
      while (i < 100) {
        i = i + 1
        if (i == 5) {
          throw breakException
        }
      }
    } catch {
      case ex: BreakControl =>
        if (ex ne breakException) throw ex
    }
    println(i)
    assert (5 == i, "i must eq 5")
  }

  @Test
  def test2() : Unit = {
    val loop = new Breaks

    var i: Int = 0
    loop.breakable {
      while (i < 100) {
        i = i + 1
        if (i == 5) {
          loop.break
        }
      }
    }
    println(i)
    assert (5 == i, "i must eq 5")
  }
}

 

class TestClass(var arg1: Int, var arg2: Int) {
  
  def init() = {
    arg1 = 0;
    arg2 = 2;
  }
}

>scalac TestClass.scala

 

>javap -c TestClass

Compiled from "TestClass.scala"

public class TestClass {

  public int arg1();

    Code:

       0: aload_0

       1: getfield      #14                 // Field arg1:I

       4: ireturn

 

  public void arg1_$eq(int);

    Code:

       0: aload_0

       1: iload_1

       2: putfield      #14                 // Field arg1:I

       5: return

 

  public int arg2();

    Code:

       0: aload_0

       1: getfield      #21                 // Field arg2:I

       4: ireturn

 

  public void arg2_$eq(int);

    Code:

       0: aload_0

       1: iload_1

       2: putfield      #21                 // Field arg2:I

       5: return

 

  public void init();

    Code:

       0: aload_0

       1: iconst_0

       2: invokevirtual #26                 // Method arg1_$eq:(I)V

       5: aload_0

       6: iconst_2

       7: invokevirtual #28                 // Method arg2_$eq:(I)V

      10: return

 

  public TestClass(int, int);

    Code:

       0: aload_0

       1: iload_1

       2: putfield      #14                 // Field arg1:I

       5: aload_0

       6: iload_2

       7: putfield      #21                 // Field arg2:I

      10: aload_0

      11: invokespecial #32                 // Method java/lang/Object."<init>":()V

      14: return

}

 

object Test {
  def main(args: Array[String]) {
    println("greet.")
  }
}

>scalac Test.scala

编译后生成了2个class文件:Test.class,Test$.class,对应2个class:Test,Test$

 

>javap -c Test

Compiled from "Test.scala"

public final class Test {

  public static void main(java.lang.String[]);

    Code:

       0: getstatic     #16                 // Field Test$.MODULE$:LTest$;

       3: aload_0

       4: invokevirtual #18                 // Method Test$.main:([Ljava/lang/String;)V

       7: return

}

 

>javap -c Test$

Compiled from "Test.scala"

public final class Test$ {

  public static Test$ MODULE$;

 

  public static {};

    Code:

       0: new           #2                  // class Test$

       3: invokespecial #12                 // Method "<init>":()V

       6: return

 

  public void main(java.lang.String[]);

    Code:

       0: getstatic     #20                 // Field scala/Predef$.MODULE$:Lscala/Predef$;

       3: ldc           #22                 // String greet.

       5: invokevirtual #26                 // Method scala/Predef$.println:(Ljava/lang/Object;)V

       8: return

}

 

class TestClass(var arg1: Int, var arg2: Int) {
  def this() = {
    this(0, 2);
  }

  def add() : Int = {
    arg1 + arg2
  }
}

object TestClassTest {
  def main(args: Array[String]) = {
    val testClass = new TestClass();

    println("arg1: " + testClass.arg1 + ", arg2: " + testClass.arg2 + ", result: " + testClass.add());

    testClass.arg1 = 100;
    testClass.arg2 = 200;

    println("arg1: " + testClass.arg1 + ", arg2: " + testClass.arg2 + ", result: " + testClass.add());
  }
}

成员变量的隐式get&set方法。如上面的arg1,arg2,在类外部通过testClass.arg1 = 100;testClass.arg2 = 200;进行set,通过testClass.arg1;testClass.arg2进行get。

 

 

Java执行Scala脚本

public class Test {

    private static Logger log = Logger.getLogger(Test.class);

    private static ScriptEngine engine;

    @BeforeClass
    public static void init() {
        engine = ScalaEngine.get();
    }

    public void test(String input) {
        engine.put("input", input);

        URL url = getClass().getResource("test.scala");
        InputStream is = null;
        try {
            is = url.openStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Reader reader = new InputStreamReader(is);
        try {
            Object result = engine.eval(reader);
            System.out.println(result);
        } catch (ScriptException e) {
            e.printStackTrace();
        }
    }

    @org.junit.Test
    public void test() {
        test("test");
        test("not test");
    }
}











test.scala
var _input = "test"
_input == input










public class ScalaEngine {

    private static Logger log = Logger.getLogger(ScalaEngine.class);

    private static ScriptEngine engine = init();

    private static ScriptEngine init() {
        ScriptEngineManager sem = new ScriptEngineManager();
        ScriptEngine engine = sem.getEngineByName("scala");

        if (engine instanceof IMain) {
            IMain entry = (IMain) engine;
            ISettings isettings = entry.isettings();
            Settings settings = entry.settings();

            MutableSettings.BooleanSetting setting = null;
            try {
                setting = (MutableSettings.BooleanSetting) field(settings, "usejavacp");
                log.info("usejavacp: " + setting.v());
                if (! setting.v()) {
                    field(setting, "v", true, MutableSettings.BooleanSetting.class);
                }
                setting = (MutableSettings.BooleanSetting) field(settings, "usejavacp");
                log.info("usejavacp: " + setting.v());
            } catch (IllegalAccessException e) {
                log.warn(e.getMessage(), e);
            }
        }
        return engine;
    }

    public static ScriptEngine get() {
        return engine;
    }

    public static Object field(Object o, String fieldName, Class<?> klass) throws IllegalAccessException {
        Field valueOps = null;
        try {
            valueOps = klass.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            throw new IllegalAccessException(e.getMessage());
        }
        valueOps.setAccessible(true);
        return valueOps.get(o);
    }

    public static Object field(Object o, String fieldName) throws IllegalAccessException {
        Class<?> klass = o.getClass();
        while (klass != Object.class) {
            Class<?> parent = klass.getSuperclass();
            Object value = null;
            try {
                value = field(o, fieldName, klass);
            } catch(IllegalAccessException e) {
                log.info("field " + fieldName + " of " + klass.getName() + " not found, would trying " + parent.getName());
            }
            if (value != null) {
                return value;
            }
            klass = parent;
        }
        throw new IllegalAccessException("field " + fieldName + " not found");
    }

    public static void field(Object o, String fieldName, Object value, Class<?> klass) throws IllegalAccessException {
        Field valueOps = null;
        try {
            valueOps = klass.getDeclaredField(fieldName);
        } catch (NoSuchFieldException e) {
            throw new IllegalAccessException(e.getMessage());
        }
        valueOps.setAccessible(true);
        valueOps.set(o, value);
    }
}

scala JUnitSuite for unit test

import org.junit.{Before, BeforeClass, Test}
import org.scalatest.junit.JUnitSuite

import scala.util.control.{Breaks, ControlThrowable}
import scala.util.control.Breaks._

private class BreakControl extends ControlThrowable

object BreaksTest {
  @BeforeClass
  def _init : Unit = {

  }
}

class BreaksTest extends JUnitSuite {

  private val breakException = new BreakControl

  def init : Unit = BreaksTest._init

  @Before
  def inittest() : Unit = {}

  @Test
  def test1() : Unit = {
    var i: Int = 0
    breakable {
      while (i < 100) {
        i = i + 1
        if (i == 5) {
          break // break()
        }
      }
    }
    println(i)
    assert (5 == i, "i must eq 5")
  }

  @Test
  def test2() : Unit = {
    val loop = new Breaks

    var i: Int = 0
    loop.breakable {
      while (i < 100) {
        i = i + 1
        if (i == 5) {
          loop.break
        }
      }
    }
    println(i)
    assert (5 == i, "i must eq 5")
  }

  @Test
  def test3() : Unit = {
    var i: Int = 0
    try {
      while (i < 100) {
        i = i + 1
        if (i == 5) {
          throw breakException
        }
      }
    } catch {
      case ex: BreakControl =>
        if (ex ne breakException) throw ex
    }
    println(i)
    assert (5 == i, "i must eq 5")
  }


}

















import java.util
import java.util.Map

import com.shenma.kafka.MessageListener
import org.junit.{Before, BeforeClass, Test}
import org.scalatest.junit.JUnitSuite

object KafkaConsumerTransportTest {

  private var consumerProperties : Map[String, Object] = null

  @BeforeClass
  def _init : Unit = {
    consumerProperties = new util.HashMap[String, Object]
    consumerProperties.put("bootstrap.servers", "192.16.10.44:9092")
    consumerProperties.put("group.id", "test")
    consumerProperties.put("enable.auto.commit", "false")
    consumerProperties.put("retries", "10")
    consumerProperties.put("auto.commit.interval.ms", "1000")
    consumerProperties.put("session.timeout.ms", "15000")
    consumerProperties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
    consumerProperties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
  }
}

class KafkaConsumerTransportTest extends JUnitSuite {

  def init : Unit = KafkaConsumerTransportTest._init

  @Before
  def inittest() : Unit = {}

  @Test
  def test() : Unit = {
    var messageListener : MessageListener[String, String] = new TestMagentCatMessageListener()
    var transport : KafkaConsumerTransport[String, String] =
      new KafkaConsumerTransport[String, String](KafkaConsumerTransportTest.consumerProperties, util.Arrays.asList("topic-2018-0925"), messageListener)
    transport run()

    // for test
    try {
      this.synchronized {
        wait()
      }
    } catch {
      case e: InterruptedException => {
        println(e)
        e.printStackTrace()
      }
    }
  }
}

 

 

 

分享到:
评论

相关推荐

    Scala编程实战.zip

    此文档是讲解实战Scala,希望对喜欢大数据的同学有所帮助!!! 学习Scala语言,不仅仅意味着熟悉新的API,更重要的是一种思维方式的转变。从原有的面向对象编程(OO)到函数式编程(FP)的思想。本书面向实际的使用场景...

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    scala-parser-combinators-2.11-1.0.4-API文档-中文版.zip

    赠送jar包:scala-parser-combinators_2.11-1.0.4.jar; 赠送原API文档:scala-parser-combinators_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-parser-combinators_2.11-1.0.4-sources.jar; 赠送Maven依赖信息...

    scala-xml_2.11-1.0.4-API文档-中英对照版.zip

    赠送jar包:scala-xml_2.11-1.0.4.jar; 赠送原API文档:scala-xml_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-xml_2.11-1.0.4-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.11-1.0.4.pom; 包含翻译后的API...

    scala-compiler-2.11.8-API文档-中英对照版.zip

    赠送jar包:scala-compiler-2.11.8.jar; 赠送原API文档:scala-compiler-2.11.8-javadoc.jar; 赠送源代码:scala-compiler-2.11.8-sources.jar; 赠送Maven依赖信息文件:scala-compiler-2.11.8.pom; 包含翻译后...

    scala编程中文pdf

    scala编程 33章 中文pdf Scala编程实战 目录 第1章字符串. 11 第2章数值39 第3章控制结构.60 第4章类和属性.103 第5章方法147 第6章对象170 第7章包和导入.190 第8章特质200 第9章函数式编程214 第10 章集合242 第...

    scala-xml_2.12-1.0.6-API文档-中文版.zip

    赠送jar包:scala-xml_2.12-1.0.6.jar; 赠送原API文档:scala-xml_2.12-1.0.6-javadoc.jar; 赠送源代码:scala-xml_2.12-1.0.6-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.12-1.0.6.pom; 包含翻译后的API...

    scala-parser-combinators_2.11-1.0.4-API文档-中英对照版.zip

    赠送jar包:scala-parser-combinators_2.11-1.0.4.jar; 赠送原API文档:scala-parser-combinators_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-parser-combinators_2.11-1.0.4-sources.jar; 包含翻译后的API...

    scala-java8-compat_2.11-0.7.0-API文档-中文版.zip

    赠送jar包:scala-java8-compat_2.11-0.7.0.jar; 赠送原API文档:scala-java8-compat_2.11-0.7.0-javadoc.jar; 赠送源代码:scala-java8-compat_2.11-0.7.0-sources.jar; 赠送Maven依赖信息文件:scala-java8-...

    flink-scala_2.12-1.14.3-API文档-中文版.zip

    赠送jar包:flink-scala_2.12-1.14.3.jar 赠送原API文档:flink-scala_2.12-1.14.3-javadoc.jar 赠送源代码:flink-scala_2.12-1.14.3-sources.jar 包含翻译后的API文档:flink-scala_2.12-1.14.3-javadoc-API...

    scala-sbt-scala编译工具

    scala 编译工具 sbt 安装包。 Little or no configuration required for simple projects Scala-based build definition that can use the full flexibility of Scala code Accurate incremental recompilation ...

    flink-scala-2.11-1.10.0-API文档-中文版.zip

    赠送jar包:flink-scala_2.11-1.10.0.jar; 赠送原API文档:flink-scala_2.11-1.10.0-javadoc.jar; 赠送源代码:flink-scala_2.11-1.10.0-sources.jar; 赠送Maven依赖信息文件:flink-scala_2.11-1.10.0.pom; ...

    scala五本经典资料集合

    scala是一个经典的语言,Scala代表了一个新的语言品种,它抹平了这些人为划分的界限。但是现在scala的相关学习资料不多,因此,本人总结了几篇写的较好的scala学习资料,包含&lt;ScalaQuery_Commerzbank_2011&gt;&lt;twitter-...

    scala 3本书打包

    这个打包文件中包含了《SCALA程序设计-JAVA虚拟机多核编程实战》《Scala编程-中文-完整版》《Scala in Action》三本书,足以让你从scala入门到精通,让我们一起愉快的学习吧。spark,scala醉了醉了。哈哈

    SCALA编程思想 原书第2版 PDF 下载

    本书介绍Scala的基础特性,采用短小精悍的“原子”解构Scala语言的元素和方法。一个“原子”即为一个小型知识点,通过代码示例引导读者逐步领悟Scala的要义,结合练习鼓励读者在实践中读懂并写出地道的Scala代码。...

    scala-compiler-2.12.7-API文档-中文版.zip

    赠送jar包:scala-compiler-2.12.7.jar; 赠送原API文档:scala-compiler-2.12.7-javadoc.jar; 赠送源代码:scala-compiler-2.12.7-sources.jar; 赠送Maven依赖信息文件:scala-compiler-2.12.7.pom; 包含翻译后...

    差分进化算法的Scala实现_Scala_代码_下载

    差分进化算法的Scala实现_Scala_代码_下载

    Scala 初学者指南

    Scala 初学指南 这本书是什么 本书是 The Neophyte's Guide to Scala 的中文翻译。 The Neophyte's Guide to Scala 是 Daniel Westheide 写的一系列有关 Scala 的文章。 ------------------------------------------...

    flink-1.14.4-scala_2.12 + CDH6.2.1 版 parcel 包

    flink-1.14.4-scala_2.12 + CDH6.2.1 版 parcel 包, 包含 FLINK-1.14.4-BIN-SCALA_2.12-el7.parcel FLINK-1.14.4-BIN-SCALA_2.12-el7.parcel.sha manifest.json (以上三个文件放入 /opt/cloudera/parcel-repo/ 下...

Global site tag (gtag.js) - Google Analytics