Tom George
Tom George

Reputation: 43

forEach in scala shows expected: Consumer[_ >:Path] actual: (Path) => Boolean

Wrong syntax problem in recursively deleting scala files

Files.walk(path, FileVisitOption.FOLLOW_LINKS)
    .sorted(Comparator.reverseOrder())
    .forEach(Files.deleteIfExists)

Upvotes: 4

Views: 2712

Answers (2)

Alexey Romanov
Alexey Romanov

Reputation: 170735

In Scala 2.12 I expect this should work:

...forEach(Files.deleteIfExists(_: Path))

The reason you need to specify argument type is because expected type is Consumer[_ >: Path], not Consumer[Path] as it would be in Scala.

If it doesn't work (can't test at the moment), try

val deleteIfExists: Consumer[Path] = Files.deleteIfExists(_)

...forEach(deleteIfExists)

Before Scala 2.12, Joe K's answer is the correct one.

Upvotes: 0

Joe K
Joe K

Reputation: 18424

The issue is that you're trying to pass a scala-style function to a method expecting a java-8-style function. There's a couple libraries out there that can do the conversion, or you could write it yourself (it's not complicated), or probably the simplest is to just convert the java collection to a scala collection that has a foreach method expecting a scala-style function as an argument:

import scala.collection.JavaConverters._

Files.walk(path, FileVisitOption.FOLLOW_LINKS)
        .sorted(Comparator.reverseOrder())
        .iterator().asScala
        .foreach(Files.deleteIfExists)

Upvotes: 8

Related Questions