Sample Examples

Exemplars are available in the src/example/java directory, a few sample snippets reproduced below:

Conversion

Convert checked Functional Interface instances and Method Handles to unchecked java.util.function.* Functional Interfaces.

Given a method that declares a checked exception (very contrived example):

import java.io.IOException;

class ExceptionalExample {

    private static int parse(String text) throws IOException
    {
       try {
         return Integer.parseInt(text);
       } catch(NumberFormatException nfe) {
         throw new IOException(nfe);
       }
    }
}

Without Unexceptional, you might write an ugly lambda like so:

import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.function.ToIntFunction;

// ...

public void convertFunctional()
{
    ToIntFunction<String> a = value -> {
       try {
         return ExceptionalExample.parse(value);
       } catch (IOException e) {
         throw new UncheckedIOException(e);
       }
    };

    a.applyAsInt("42");
}

With Unexceptional, you can just write:

import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.function.ToIntFunction;

// ...

public void convertFunctional()
{
    ToIntFunction<String> b = Exceptional.uncheckToIntFunction(ExceptionalExample::parse);

    a.applyAsInt("42");
}

Invocation

Invoking checked functional types and method handles without wrapping in try-catch.

As an alternative to converting functional types, you can just invoke directly.

Given the contrived parse method from previous example, you can use Unexceptional to invoke directly:

import io.earcam.unexceptional.Exceptional;

// ...

public void invokeFunctional()
{
    int fortyTwo = Exceptional.applyAsInt(ExceptionalExample::parse, "42");
}   

File List

Contrived example of calling Files::list with Stream API.

Vanilla

// Vanilla Stream API, in a manner that would distress Dijkstra
public static List<String> listFiles(Path path)
{
    List<String> a;
    try {
       a = Files.list(path)
          .map(Path::toFile)
          .map(t -> {
              try {
                 return t.getCanonicalFile();
              } catch (IOException e) {
                 throw new UncheckedIOException(e);
              }
          })
          .map(File::toURI)
          .map(t -> {
              try {
                 return t.toURL();
              } catch (MalformedURLException e) {
                 throw new UncheckedIOException(e);
              }
          })
          .map(Object::toString)
          .collect(toList());
    } catch (IOException e) {
       throw new UncheckedIOException(e);
    }
    return a;
}

Unexceptional / EmeticStream

// Static imports from Exceptional
static List<String> listFiles(Path path)
{
    return apply(Files::list, path)
       .map(Path::toFile)
       .map(uncheckFunction(File::getCanonicalFile))
       .map(File::toURI)
       .map(uncheckFunction(URI::toURL))
       .map(Object::toString)
       .collect(toList());
}

 
 

// EmeticStream, less efficient on GC, more efficient on the eye
static List<String> listFiles(Path path)
{
    return emesis(Files::list, path)
       .map(Path::toFile)
       .map(File::getCanonicalFile)
       .map(File::toURI)
       .map(Object::toString)
       .collect(toList());
}




Back to top

Version: 1.0.0. Last Published: 2018-07-27.