163 lines
5.4 KiB
Java
163 lines
5.4 KiB
Java
|
import java.awt.Point;
|
|||
|
import java.io.IOException;
|
|||
|
import java.lang.annotation.Documented;
|
|||
|
import java.lang.annotation.ElementType;
|
|||
|
import java.lang.annotation.Retention;
|
|||
|
import java.lang.annotation.RetentionPolicy;
|
|||
|
import java.lang.annotation.Target;
|
|||
|
import java.nio.file.Files;
|
|||
|
import java.nio.file.Path;
|
|||
|
import java.util.*;
|
|||
|
import java.util.function.Predicate;
|
|||
|
import java.util.stream.Collectors;
|
|||
|
|
|||
|
class Java11 {
|
|||
|
public static void main(String[] args) {
|
|||
|
////////
|
|||
|
// 1. //
|
|||
|
////////
|
|||
|
// if the resource is referenced by a final or effectively final variable,
|
|||
|
// a try-with-resources statement can manage a resource without a new variable being declared:
|
|||
|
MyAutoCloseable mac = new MyAutoCloseable();
|
|||
|
try (mac) {
|
|||
|
// do some stuff with mac
|
|||
|
}
|
|||
|
|
|||
|
////////
|
|||
|
// 2. //
|
|||
|
////////
|
|||
|
// use diamond operator in conjunction with anonymous inner classes
|
|||
|
List<Integer> fc = new ArrayList<>(1) {}; // anonymous inner class
|
|||
|
|
|||
|
List<? extends Integer> fc0 = new ArrayList<>(1) {
|
|||
|
// anonymous inner class
|
|||
|
};
|
|||
|
|
|||
|
List<?> fc1 = new ArrayList<>(1) {}; // anonymous inner class
|
|||
|
|
|||
|
////////
|
|||
|
// 4. //
|
|||
|
////////
|
|||
|
// Local Variable Type Inference
|
|||
|
var message = "Hello, Java 10";
|
|||
|
var point = new Point(1, 2);
|
|||
|
|
|||
|
////////
|
|||
|
// 5. //
|
|||
|
////////
|
|||
|
// immutable Collections/ Maps
|
|||
|
Map<String, Integer> meineMap = Map.of();
|
|||
|
Set<String> meinSet = Set.of("key1", "key2", "key3");
|
|||
|
List<String> meineListe = List.copyOf(meinSet);
|
|||
|
|
|||
|
////////
|
|||
|
// 6. //
|
|||
|
////////
|
|||
|
// Optional to Stream Optional.stream() gives us an easy way to you use the power of Streams on Optional elements
|
|||
|
List<String> filteredList = new ArrayList<Optional<String>>().stream()
|
|||
|
.flatMap(Optional::stream)
|
|||
|
.collect(Collectors.toList());
|
|||
|
|
|||
|
////////
|
|||
|
// 7. //
|
|||
|
////////
|
|||
|
// Collectors get additional methods to collect a Stream into unmodifiable List, Map or Set:
|
|||
|
List<Integer> evenList = new ArrayList<Integer>().stream()
|
|||
|
.filter(i -> i % 2 == 0)
|
|||
|
.collect(Collectors.toUnmodifiableList());
|
|||
|
|
|||
|
////////
|
|||
|
// 8. //
|
|||
|
////////
|
|||
|
// Optional got a new method orElseThrow() which doesn’t take any argument and throws NoSuchElementException if no value is present:
|
|||
|
Integer firstEven = List.of(1, 2, 3).stream()
|
|||
|
.filter(i -> i % 2 == 0)
|
|||
|
.findFirst()
|
|||
|
.orElseThrow();
|
|||
|
|
|||
|
////////
|
|||
|
// 9. //
|
|||
|
////////
|
|||
|
// Java 11 adds a few new methods to the String class
|
|||
|
var multilineString = "Baeldung helps \n \n developers \n explore Java.";
|
|||
|
List<String> lines = multilineString.lines().collect(Collectors.toList());
|
|||
|
assert " ".isBlank();
|
|||
|
assert " x ".strip().equals("x");
|
|||
|
assert " x ".stripLeading().equals("x ");
|
|||
|
assert " x ".stripTrailing().equals(" x");
|
|||
|
assert "x".repeat(5).equals("xxxxx");
|
|||
|
|
|||
|
/////////
|
|||
|
// 10. //
|
|||
|
/////////
|
|||
|
// We can use the new readString and writeString static methods from the Files class:
|
|||
|
String fileContent = null;
|
|||
|
try {
|
|||
|
Path filePath = Files.writeString(Files.createTempFile("demo", ".txt"), "Sample text");
|
|||
|
fileContent = Files.readString(filePath);
|
|||
|
} catch (IOException ioe) {}
|
|||
|
assert fileContent.equals("Sample text");
|
|||
|
|
|||
|
/////////
|
|||
|
// 11. //
|
|||
|
/////////
|
|||
|
// The java.util.Collection interface contains a new default toArray method which takes an IntFunction argument.
|
|||
|
List<String> sampleList = List.of("Java", "Kotlin");
|
|||
|
String[] sampleArray = sampleList.toArray(String[]::new);
|
|||
|
|
|||
|
/////////
|
|||
|
// 12. //
|
|||
|
/////////
|
|||
|
// A static not method has been added to the Predicate interface.
|
|||
|
sampleList = List.of("Java", "\n \n", "Kotlin", " ");
|
|||
|
List<String> withoutBlanks = sampleList.stream()
|
|||
|
.filter(Predicate.not(String::isBlank))
|
|||
|
.collect(Collectors.toList());
|
|||
|
// While not(isBlank) reads more naturally than isBlank.negate(), the big advantage is that we can also use not with method references,
|
|||
|
// like not(String::isBlank).
|
|||
|
|
|||
|
/////////
|
|||
|
// 13. //
|
|||
|
/////////
|
|||
|
// Support for using the local variable syntax (var keyword) in lambda parameters was added in Java 11.
|
|||
|
// We can make use of this feature to apply modifiers to our local variables, like defining a type annotation:
|
|||
|
sampleList = List.of("Java", "Kotlin");
|
|||
|
String resultString = sampleList.stream()
|
|||
|
.map((@Nonnull var x) -> x.toUpperCase())
|
|||
|
.collect(Collectors.joining(", "));
|
|||
|
assert resultString.equals("JAVA, KOTLIN");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class MyAutoCloseable implements AutoCloseable {
|
|||
|
public void close() {}
|
|||
|
}
|
|||
|
|
|||
|
////////
|
|||
|
// 3. //
|
|||
|
////////
|
|||
|
// Interfaces in the upcoming JVM version can have private methods, which can be used to split lengthy default methods
|
|||
|
interface InterfaceWithPrivateMethods {
|
|||
|
private static String staticPrivate() {
|
|||
|
return "static private";
|
|||
|
}
|
|||
|
|
|||
|
private String instancePrivate() {
|
|||
|
return "instance private";
|
|||
|
}
|
|||
|
|
|||
|
default void check() {
|
|||
|
String result = staticPrivate();
|
|||
|
InterfaceWithPrivateMethods pvt = new InterfaceWithPrivateMethods() {
|
|||
|
// anonymous class
|
|||
|
};
|
|||
|
result = pvt.instancePrivate();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
@Documented
|
|||
|
@Retention(RetentionPolicy.RUNTIME)
|
|||
|
@Target(ElementType.PARAMETER)
|
|||
|
public @interface Nonnull {}
|