小编sen*_*nia的帖子

Scala:合并地图

如何合并如下地图:

Map1 = Map(1 -> Class1(1), 2 -> Class1(2))
Map2 = Map(2 -> Class2(1), 3 -> Class2(2))
Run Code Online (Sandbox Code Playgroud)

合并后.

Merged = Map( 1 -> List(Class1(1)), 2 -> List(Class1(2), Class2(1)), 3 -> Class2(2))
Run Code Online (Sandbox Code Playgroud)

可以是List,Set或具有size属性的任何其他集合.

merge scala map

37
推荐指数
6
解决办法
4万
查看次数

字符串插值与串联

字符串插值比串联在scala中构建字符串更高效吗?例如:

val myVal = "def"
val test = s"abs${myVal}ghi"
Run Code Online (Sandbox Code Playgroud)

VS

val test = "abc" + myVal + "ghi"
Run Code Online (Sandbox Code Playgroud)

我问的是因为我需要为具有大量参数的内容编写toString方法,因此内插字符串变得非常冗长且令人困惑,我想将其分解为多行但是担心如果我连接它会表现不好.class

string performance scala

17
推荐指数
1
解决办法
5291
查看次数

如何使用Groovy从Oracle获取游标?

我正在使用Groovy脚本Mule ESBOracle存储过程(包括游标)获取输出参数并获得异常.

最小的例子:

import groovy.sql.Sql
import oracle.jdbc.pool.OracleDataSource
import oracle.jdbc.driver.OracleTypes

def ds = new OracleDataSource()
// setting data source parameters here

def sql = new Sql(ds)
def data = []

sql.call("""declare
result_table sys_refcursor;
begin

open result_table for select 1 as a from dual;

insert into CURSOR_TEST (ID) values (1);
commit;

${Sql.resultSet OracleTypes.CURSOR} := result_table;

insert into CURSOR_TEST (ID) values (2);
commit;

end;
"""
){ table ->

  throw new RuntimeException("Never getting this exception.")

  table.eachRow {
    data …
Run Code Online (Sandbox Code Playgroud)

sql oracle groovy jdbc mule

12
推荐指数
1
解决办法
2412
查看次数

Scala:在for循环中声明val,如果条件

我是一个scala初学者,并试图了解val如何在Scala中工作.我读到vals无法修改.当我执行以下操作时:

for( line <- Source.fromFile(args(0)).getLines() ) {
   val currentLine = line
   println(currentLine)
}
Run Code Online (Sandbox Code Playgroud)

currentLine在每次迭代中都会更新,而我希望它可以用第一行初始化并保持到最后,或者至少给出某种重新初始化错误.为什么会这样?是否在每次迭代中创建并销毁了val?我的第二个问题:如果在下面的代码中我想使用x outside.

if( some condition is satisfied) val x = 2 else val x = 3
Run Code Online (Sandbox Code Playgroud)

截至目前,我正在收到"非法表达简单表达"错误.有没有办法在外面使用x?

scala

12
推荐指数
1
解决办法
1万
查看次数

为什么我不能在代码块中递归地定义变量?

为什么我不能在代码块中递归地定义变量?

scala> {
     | val test: Stream[Int] = 1 #:: test
     | }
<console>:9: error: forward reference extends over definition of value test
              val test: Stream[Int] = 1 #:: test
                                            ^

scala> val test: Stream[Int] = 1 #:: test
test: Stream[Int] = Stream(1, ?)
Run Code Online (Sandbox Code Playgroud)

lazy 关键字解决了这个问题,但我无法理解为什么它没有代码块但在代码块中抛出编译错误.

recursion scala

10
推荐指数
1
解决办法
1778
查看次数

基于类的类型参数在Poly1方法中映射HList

我有类,参数化HList和其他类型.如何使用mapHList在其方法之一?

编译此代码抛出java.lang.AssertionError:

class Test[L <: HList, P](l: L, p: P) {
  type Cont[T] = (P, T)
  object generator extends (Id ~> Cont) {
    def apply[T](t: T) = p -> t
  }
  def test(implicit m: Mapper[generator.type, L]) = {
    l map generator
  }
}

new Test(1 :: HNil, 'a).test // java.lang.AssertionError
Run Code Online (Sandbox Code Playgroud)

我的目标是这样的结果:

type Cont[T] = (Symbol, T)
val p = 'a
object generator extends (Id ~> Cont) {
  def apply[T](t: T) = p …
Run Code Online (Sandbox Code Playgroud)

functional-programming scala hlist type-level-computation shapeless

5
推荐指数
1
解决办法
348
查看次数

为什么headOption更快

我更改了一些代码,速度提高了4.5倍。我想知道为什么。过去基本上是:

def doThing(queue: Queue[(String, String)]): Queue[(String, String)] = queue match {
  case Queue((thing, stuff), _*) => doThing(queue.tail)
  case _ => queue
}
Run Code Online (Sandbox Code Playgroud)

我将其更改为此,以极大地提高速度:

def doThing(queue: Queue[(String, String)]): Queue[(String, String)] = queue.headOption match {
  case Some((thing, stuff)) => doThing(queue.tail)
  case _ => queue
}
Run Code Online (Sandbox Code Playgroud)

_*什么和为什么与headOption相比如此昂贵?

queue optimization scala option

5
推荐指数
1
解决办法
2093
查看次数

隐含参数VS默认参数值

Scala中至少有两种技术可以将默认值传递给方法

1)默认参数值

scala> def f(i: Int = 0) = i
f: (i: Int)Int

scala> f()
res0: Int = 0

scala> f(1)
res1: Int = 1
Run Code Online (Sandbox Code Playgroud)

2)隐含参数

scala> def g(implicit i: Int) = i
g: (implicit i: Int)Int

scala> implicit val default = 0
default: Int = 0

scala> g(1)
res5: Int = 1

scala> g
res7: Int = 0
Run Code Online (Sandbox Code Playgroud)

在哪种情况下你选择一个或另一个?凭借隐式的力量,默认值是一个有用的功能吗?

scala implicit

4
推荐指数
2
解决办法
2551
查看次数

在RestController方法中获取ServerWebExchange

如何在控制器方法中获取ServerWebExchange或反应ServerHttpResponse

我一直NestedServletException在尝试调用accept的rest controller方法ServerWebExchange

我的控制器如下所示:

@RestController
@RequestMapping(path = "/path/{param1}/path", produces = MediaType.APPLICATION_JSON_VALUE)
public class MyController {
    @GetMapping("/path")
    public Mono<Void> method(ServerWebExchange exchange) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

主要方法:

@SpringBootApplication
@ComponentScan(basePackages = {"my.package1", "my.package2"})
@EnableWebFlux
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

例外:

io.undertow.request:UT005023:对/ path / value / path / path的异常处理请求

org.springframework.web.util.NestedServletException:请求处理失败;嵌套的异常是java.lang.IllegalStateException:没有为接口org.springframework.web.server.ServerWebExchange找到主要或默认构造函数

java spring spring-boot spring-webflux

4
推荐指数
1
解决办法
1103
查看次数

方法返回NodeBuffer而不是Elem,这违反了类型检查规则

有两种方法,都返回xml:

 def method1 = 
   <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope>
      <soap:Header>
        {Elem(....)}
      </soap:Header>
    </soap:Envelope>

 def method2 = 
  <someXml>
    //.......
  </someXml>
Run Code Online (Sandbox Code Playgroud)

还有一种方法可以获得Elem:

def method3(a: Elem) = //....

val xml1 = method1
val xml2 = method2

method3(xml1) //error
method3(xml2) //ok
Run Code Online (Sandbox Code Playgroud)

它说method1回报NodeBuffer并且不能接受它,而method2回报则Elem完全没问题.

这是为什么?我该怎么办?

xml scala

3
推荐指数
1
解决办法
1347
查看次数