Convert to Scala code PEM to DER Certificate Follow it up from Google KMS Library

Viewed 30

I am new to Scala and was trying to convert this:

  public static byte[] convertPemToDer(String pem) {
            BufferedReader bufferedReader = new BufferedReader(new StringReader(pem));
            String encoded =
                    bufferedReader
                            .lines()
                            .filter(line -> !line.startsWith("-----BEGIN") && !line.startsWith("-----END"))
                            .collect(Collectors.joining());
            return Base64.getDecoder().decode(encoded);
        }

to Scala code:

def convertPemToDer(pem: String): Array[Byte] = {
    val bufferedReader = new BufferedReader(new StringReader(pem))
    val encoded = bufferedReader.lines.filter((line: String) => !line.startsWith("-----BEGIN") && !line.startsWith("-----END")).collect(Collectors.joining)
    Base64.getDecoder.decode(encoded)
  }

It shows this type mismatch within filter:

type mismatch; found : String => Boolean required: java.util.function.Predicate[_ >: String]
1 Answers

Double check your imports. I could run your code by using these imports:

import java.io.{BufferedReader, StringReader}
import java.util.Base64
import java.util.stream.Collectors

The code compiled and ran just fine. I just added a println at the end:

object Main extends App {

  def convertPemToDer(pem: String): Array[Byte] = {
    val bufferedReader = new BufferedReader(new StringReader(pem))
    val encoded = bufferedReader.lines
      .filter((line: String) =>
        !line.startsWith("-----BEGIN") && !line.startsWith("-----END")
      )
      .collect(Collectors.joining)
    Base64.getDecoder.decode(encoded)
  }

  println(convertPemToDer("Elephant").mkString("Array(", ", ", ")"))

}

Output:

Array(18, 87, -87, -123, -87, -19)

If you are not using Intellij with the Scala plugin, your IDE might not be able to recognize Functional Interfaces as Single Abstract Methods. So you might need to adapt your code into a more Java-style approach, like this:

  def convertPemToDer(pem: String): Array[Byte] = {
    val bufferedReader = new BufferedReader(new StringReader(pem))
    val encoded = bufferedReader.lines
      .filter(new Predicate[String] {
        override def test(line: String): Boolean =
          !line.startsWith("-----BEGIN") && !line.startsWith("-----END")
      })
      .collect(Collectors.joining)
    Base64.getDecoder.decode(encoded)
  }
Related