Java 8

Lambda-uttrykk

Strømmer

Default-metoder

Lambda-uttrykk

class HelloTask implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello!");
    }
}

Runnable task = new HelloTask();

new Thread(task).start();
class HelloTask implements Runnable {
    @Override
    public void run() {
        System.out.println("Hello!");
    }
}

Runnable task = new HelloTask();

new Thread(task).start();

Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello!");
    }
};

new Thread(task).start();

Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello!");
    }
};

new Thread(task).start();

En anonym klasse er et uttrykk som består av:

  • ​Ordet​ new
  • Navnet på grensesnittet/klassen man implementerer/arver
  • Vanlig innhold til en klasse-deklarasjon

Runnable task = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello!");
    }
};

new Thread(task).start();

Runnable task = () -> {
    System.out.println("Hello!");
};

new Thread(task).start();

Runnable task = () -> {
    System.out.println("Hello!");
};

new Thread(task).start();

Et lambda-uttrykk består av:

  • ​En liste argumenter (her ingen)
  • En pil
  • En metode-kropp

Java finner selv ut av navnet på klassen, metoden og typen på argumentene


Runnable task = () -> {
    System.out.println("Hello!");
};

new Thread(task).start();

Runnable task = () -> System.out.println("Hello!");

new Thread(task).start();

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello!");
    }
}).start();

Java 7


new Thread(() -> System.out.println("Hello!")).start();

Java 8

Et funksjonelt grensesnitt er et grensesnitt som har nøyaktig én abstrakt metode.

I Java 8 er det kommet en hel haug slike grensesnitt i java.util.function.*

Mange gamle grensesnitt er også funksjonelle.

Collection<E>:

Predicate<T>:

List<String> names = new LinkedList<>(Arrays.asList(
    "Arne", "Bjarne", "Kåre", "Leif", "Bob", "Birger"));

System.out.println(names);

names.removeIf(s -> s.startsWith("B"));

System.out.println(names);
[Arne, Bjarne, Kåre, Leif, Bob, Birger]
[Arne, Kåre, Leif]​

Resultat:

Metode-referanser

myList::add

En metode-referanse er:

  • ​Navnet på en metode
  • Og hvor du finner den
  • Adskilt av to kolon
List<Person> myList = ...;
myList::add
Consumer<Person>

Hvis vi har:

Og vi skriver:

Får vi en:

Integer::parseInt
Function<String, Integer>

Hvis vi skriver:

Får vi en:

ToIntFunction<String>

Eller en:

Strømmer

En strøm er en sekvens av elementer man kan utføre samlede operasjoner på.

Det er kommet en ny pakke med klasser til strømmer i java.util.stream.*

Alle Collections har fått en metode .stream() og arrays kan strømmes med Arrays.stream()

ArrayList<String> numbers = new ArrayList<>();

new Scanner(new File("input.txt"))
	.useDelimiter("\\D+")
	.forEachRemaining(numbers::add);

int sumOfOddSquares = numbers.stream()
	.mapToInt(Integer::parseInt)
	.filter(x -> x % 2 != 0)
	.map(x -> x * x)
	.sum();

System.out.println(sumOfOddSquares);

 

  • En kilde
  • Mellom-operasjoner (intermediate operations)
  • En slutt-operasjon (terminal operation)

En pipeline består av:

Default-metoder

I Java 8 kan man implementere metoder i grensesnitt, man må bare markere dem med default:

interface Named {
    String getName();

    default void sayHello() {
        System.out.println("Hello, my name is " + getName());
    }
}

Eksempler på default-metoder lagt til i Java 8:

  • Iterator.forEachRemaining()
  • Collection.stream()
  • List.replaceAll()
  • List.sort()
  • Map.compute()
  • Comparator.reversed()
  • Comparator.thenComparing()

Og forresten, i Java 8 kan grensesnitt også ha statiske metoder.

Optional<T>

java.time.*

java.util.concurrent.LongAccumulator m.m.

Arrays.parallelSort()

Base64

PrimitiveIterator

Files.list(), Files.walk() m.m.

Spliterator

Java 8

By Erik Vesteraas

Java 8

  • 1,067