관리자

element의 class 이름을 확인하는 method

element.getClass

 

https://www.geeksforgeeks.org/determine-the-class-of-a-scala-object/

scala에서는 for {}를 통해 중첩 for문을 만들 수 있다.

단순히 여러 조건을 나열하는게 아니라

line마다 새로운 loop가 생긴다.

 

scala documentation에 따르면 for ... yield는 foreach, map, flatMap, filter or withFilter의 syntatic sugar일 뿐이다.

즉, foreach, map, flatMap, withFilter를 좀 더 편리하게 풀어쓴 것뿐이다.

취소선으로 표시한 부분은 좀 더 실험을 해봐야겠다.

 

1. for { 1 줄 } yield

 val t = for {
  e1 <- 1 to 3
} yield {
  e1
}

def main(args: Array[String]) {
  println(t)
}

// result
// Vector(1, 2, 3)

 

2. for { 2줄 } yield

for는 한번만 작성했지만, nested for loop같은 결과가 나오는 것을 확인할 수 있다.

generate되는 순서도 우리가 생각하는 for문과 동일하다!

새로운 line마다 새로운 for loop가 시작되는 것처럼,

첫번째 line이 outer loop이고, 아래로 갈수록 inner loop이다.

 val t = for {
  e1 <- 1 to 3
  e2 <- List('a', 'b', 'c', 'd')
} yield {
  (e1, e2)
}

def main(args: Array[String]) {
  println(t)
}


// result
// Vector((1,a), (1,b), (1,c), (1,d), (2,a), (2,b), (2,c), (2,d), (3,a), (3,b), (3,c), (3,d))

 

3. for { 3 줄 } yield

yield의 값이 (e1,e2)로 2번과 동일하지만, 결과는 2배로 길어진 것을 확인할 수 있다.

val t = for {
  e1 <- 1 to 3
  e2 <- List('a', 'b', 'c', 'd')
  e3 <- List('Z', 'X')
} yield {
  (e1, e2)
}

def main(args: Array[String]) {
  println(t)
}
// result
// Vector((1,a), (1,a), (1,b), (1,b), (1,c), (1,c), (1,d), (1,d), (2,a), (2,a), (2,b), (2,b), (2,c), (2,c), (2,d), (2,d), (3,a), (3,a), (3,b), (3,b), (3,c), (3,c), (3,d), (3,d))

scala에는 2가지의 for문이 존재한다.

 

1. for(...) {}

2.for(...) yield

 

yield는 Vector 형태로 결과를 반환한다.

 

예시)

for(i<- range 1 to 3) println(i)

// result
// 1
// 2
// 3
val tt =
for(element <- 1 to 3) 
  yield element
  
  
def main(args: Array[String]) {
  println(tt)
}

//result
//Vector(1, 2, 3)

 

()대신 {}를 이용해서 multiline으로 작성할 수도 있다.

val t = for {
  element <- 1 to 3
} yield {
  element
}

jdk-version : 13

OS : macOS

installing sbt on macOS : https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Mac.html

 

문제 :

global에서 sbt 1.3.x 버전은 잘 실행되나,

build.sbt에서 sbt 버전이 1.2.8인 경우,

sbt가 실행조차 되지 않고 아래와 같은 에러가 난다.

java.io.ioerror: java.lang.runtimeexception: /packages cannot be represented as URI

 

build.sbt에서 sbt 버전을 1.3.7로 수정했더니, plugin이 1.3.x과 호환이 안되서 에러가 난다 ㅠㅠㅠ

결론적으로는 jdk-version이 안맞는 문제였다.

 

사실 sbt는 jdk 13과 호환이 된다. 하지만 sbt 1.3.x는 호환이 되나 1.2.x는 안되는 것 같다...

documenation에서 호환된다는 말만 보고 가볍게 넘어갔었는데 여기에 문제가 있었다...

구글링해도 검색 결과가 없는데, 검색할 수록 내가 설정을 잘못했다기보단 프로그램/라이브러리 상의 문제 같았다.

이틀 동안 구글링했는데....ㅠㅠㅠ

스펙과 내 환경을 똑바로 확인하자+ documenation이 latest version인지 확인하자.

역시 환경 설정이 제일 어려운 것 같다....

 

해결방안  + 결론 :

jdk 11 을 설치하고 sbt를 jdk 11로 실행하니 sbt도 잘 실행되고 project 빌드에도 이상이 없다!

그 뒤로는 설정이 저장되어서 저절로 jdk 11로 실행된다.

 

jdk 설치 : https://adoptopenjdk.net

 

AdoptOpenJDK

AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. Supported platforms include Linux, macOS, Windows, ARM, Solaris, and AIX.

adoptopenjdk.net

사용할 수 있는 자바 버전 확인 : sbt -J-showversion

 

원하는 자바 버전으로 실행

sbt -java-home /Library/Java/JavaVirtualMachines/{java-version}/Contents/Home

나의 경우 : sbt -java-home /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home

 

 

Issue :

Downloaded sbt 1.3.7 successfully, it runs well globally.

However I couldn't run sbt on project with version 1.2.8.

It throws error below:

java.io.ioerror: java.lang.runtimeexception: /packages cannot be represented as URI

 

Problem was on the version of jdk.

sbt is compatible with jdk 13. It is true for sbt 1.3.x but probably not for 1.2.x.

So I needed jdk 11 to run sbt 1.2.8.

 

Solution :

instsll jdk 11, run sbt with jdk 11.

After the first run, configuration is saved.

No need to set option every time. sbt will automatically use jdk 11 to build :)

 

jdk install : https://adoptopenjdk.net

 

AdoptOpenJDK

AdoptOpenJDK provides prebuilt OpenJDK binaries from a fully open source set of build scripts and infrastructure. Supported platforms include Linux, macOS, Windows, ARM, Solaris, and AIX.

adoptopenjdk.net

 

show available java optionsbt -J-showversion

 

run sbt with specific jdk otpion:

sbt -java-home /Library/Java/JavaVirtualMachines/{java-version}/Contents/Home

in my case : sbt -java-home /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home

 

'언어 > Scala' 카테고리의 다른 글

scala for comprehension, for {...} yield  (0) 2020.02.03
type / class 확인하기  (0) 2020.01.26
for{...} yield 이해하기2  (0) 2020.01.26
for loop/ for() /for{} /for(...) yield  (0) 2020.01.26
원소 숫자 세기 : count number of elements  (0) 2020.01.24

리스트의 원소 숫자 세기 : counting number of elements in the list

ex. ["a", "b", "c" ,"a", "c", "a" ] -> [("a", 3), ("b",1), ("c", 2)]

 

def count(L : list) = L.groupby(identity).mapValues(_.size)

 

+ Recent posts