Java 8
Bruk egen maskin hvis du har Java 8 på den, eller logg inn på Linux.
(Det er så langt ikke installert Java 8 på Windows-maskinene)
Kommando for å sjekke versjon:
java -version
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();
Runnable task = new Runnable() {
@Override
public void run() {
System.out.println("Hello!");
}
};
new Thread(task).start();
Java 7
Runnable task = () -> System.out.println("Hello!");
new Thread(task).start();
Java 8
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:
class ExampleClass {
public static void main(String[] args) {
new Thread(ExampleClass::sayHello).start();
}
static void sayHello() {
System.out.println("Hello");
}
}
class ExampleClass {
public static void main(String[] args) {
ExampleClass someObject = new ExampleClass();
new Thread(someObject::sayHello).start();
}
void sayHello() {
System.out.println("Hello");
}
}
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:
int sum = IntStream.range(1, 1000)
.filter(x -> x % 3 == 0 || x % 5 == 0)
.sum();
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 - Puslegruppe
By Erik Vesteraas
Java 8 - Puslegruppe
- 1,638