diff --git a/.gitignore b/.gitignore index f911407f..21ae0ccd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,10 @@ .idea *.iml out +/target/ + +.settings/org.eclipse.jdt.core.prefs +.settings/org.eclipse.m2e.core.prefs +.project +.classpath /bin/ diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..a6fd6974 --- /dev/null +++ b/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + com.winterbe + java8-tutorial + 1.0.0 + + + + junit + junit + 4.12 + test + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.0 + + 1.8 + 1.8 + + + + + diff --git a/res/nashorn1-modified.js b/res/nashorn1-modified.js new file mode 100644 index 00000000..eafad136 --- /dev/null +++ b/res/nashorn1-modified.js @@ -0,0 +1,9 @@ +var fun1 = function(name) { + print('Hi there from Javascript, ' + name); + return "greetings from javascript"; +}; + +var fun2 = function (object) { + print("JS Class Definition: " + Object.prototype.toString.call(object)); +}; +print('foobar'); diff --git a/res/output.js b/res/output.js new file mode 100644 index 00000000..e79d7130 --- /dev/null +++ b/res/output.js @@ -0,0 +1 @@ +print('Hello World'); \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/lambda/Interface1.java b/src/com/winterbe/java8/samples/lambda/Interface1.java deleted file mode 100644 index 6a87fc10..00000000 --- a/src/com/winterbe/java8/samples/lambda/Interface1.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.winterbe.java8.samples.lambda; - -/** - * @author Benjamin Winterberg - */ -public class Interface1 { - - interface Formula { - double calculate(int a); - - default double sqrt(int a) { - return Math.sqrt(positive(a)); - } - - static int positive(int a) { - return a > 0 ? a : 0; - } - } - - public static void main(String[] args) { - Formula formula1 = new Formula() { - @Override - public double calculate(int a) { - return sqrt(a * 100); - } - }; - - formula1.calculate(100); // 100.0 - formula1.sqrt(-23); // 0.0 - Formula.positive(-4); // 0.0 - -// Formula formula2 = (a) -> sqrt( a * 100); - } - -} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/lambda/Lambda1.java b/src/com/winterbe/java8/samples/lambda/Lambda1.java deleted file mode 100644 index 5bb5b658..00000000 --- a/src/com/winterbe/java8/samples/lambda/Lambda1.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.winterbe.java8.samples.lambda; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Optional; - -/** - * @author Benjamin Winterberg - */ -public class Lambda1 { - - public static void main(String[] args) { - List names = Arrays.asList("peter", "anna", "mike", "xenia"); - - Collections.sort(names, new Comparator() { - @Override - public int compare(String a, String b) { - return b.compareTo(a); - } - }); - - Collections.sort(names, (String a, String b) -> { - return b.compareTo(a); - }); - - Collections.sort(names, (String a, String b) -> b.compareTo(a)); - - Collections.sort(names, (a, b) -> b.compareTo(a)); - - System.out.println(names); - - names.sort(Collections.reverseOrder()); - - System.out.println(names); - - List names2 = Arrays.asList("peter", null, "anna", "mike", "xenia"); - names2.sort(Comparator.nullsLast(String::compareTo)); - System.out.println(names2); - - List names3 = null; - - Optional.ofNullable(names3).ifPresent(list -> list.sort(Comparator.naturalOrder())); - - System.out.println(names3); - } - -} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/lambda/Lambda4.java b/src/com/winterbe/java8/samples/lambda/Lambda4.java deleted file mode 100644 index e14b4b29..00000000 --- a/src/com/winterbe/java8/samples/lambda/Lambda4.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.winterbe.java8.samples.lambda; - -/** - * @author Benjamin Winterberg - */ -public class Lambda4 { - - static int outerStaticNum; - - int outerNum; - - void testScopes() { - int num = 1; - - Lambda2.Converter stringConverter = - (from) -> String.valueOf(from + num); - - String convert = stringConverter.convert(2); - System.out.println(convert); // 3 - - Lambda2.Converter stringConverter2 = (from) -> { - outerNum = 13; - return String.valueOf(from); - }; - - String[] array = new String[1]; - Lambda2.Converter stringConverter3 = (from) -> { - array[0] = "Hi there"; - return String.valueOf(from); - }; - - stringConverter3.convert(23); - - System.out.println(array[0]); - } - - public static void main(String[] args) { - new Lambda4().testScopes(); - } - -} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/lambda/Person.java b/src/com/winterbe/java8/samples/lambda/Person.java deleted file mode 100644 index 800d39fd..00000000 --- a/src/com/winterbe/java8/samples/lambda/Person.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.winterbe.java8.samples.lambda; - -/** -* @author Benjamin Winterberg -*/ -public class Person { - public String firstName; - public String lastName; - - public Person() {} - - public Person(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; - } -} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn10.java b/src/com/winterbe/java8/samples/nashorn/Nashorn10.java deleted file mode 100644 index ed4a6d17..00000000 --- a/src/com/winterbe/java8/samples/nashorn/Nashorn10.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.winterbe.java8.samples.nashorn; - -import jdk.nashorn.api.scripting.NashornScriptEngine; - -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; -import java.util.concurrent.TimeUnit; - -/** - * @author Benjamin Winterberg - */ -public class Nashorn10 { - - public static void main(String[] args) throws ScriptException, NoSuchMethodException { - NashornScriptEngine engine = (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn"); - engine.eval("load('res/nashorn10.js')"); - - long t0 = System.nanoTime(); - - for (int i = 0; i < 100000; i++) { - engine.invokeFunction("testPerf"); - } - - long took = System.nanoTime() - t0; - System.out.format("Elapsed time: %d ms", TimeUnit.NANOSECONDS.toMillis(took)); - } -} diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn11.java b/src/com/winterbe/java8/samples/nashorn/Nashorn11.java deleted file mode 100644 index 355e92eb..00000000 --- a/src/com/winterbe/java8/samples/nashorn/Nashorn11.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.winterbe.java8.samples.nashorn; - -import jdk.nashorn.api.scripting.NashornScriptEngine; - -import javax.script.Bindings; -import javax.script.ScriptContext; -import javax.script.ScriptEngineManager; -import javax.script.ScriptException; -import javax.script.SimpleBindings; -import javax.script.SimpleScriptContext; - -/** - * @author Benjamin Winterberg - */ -public class Nashorn11 { - - public static void main(String[] args) throws Exception { -// test1(); -// test2(); -// test3(); -// test4(); -// test5(); -// test6(); -// test7(); - test8(); - } - - private static void test8() throws ScriptException { - NashornScriptEngine engine = createEngine(); - - engine.eval("var obj = { foo: 23 };"); - - ScriptContext defaultContext = engine.getContext(); - Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context1 = new SimpleScriptContext(); - context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context2 = new SimpleScriptContext(); - context2.getBindings(ScriptContext.ENGINE_SCOPE).put("obj", defaultBindings.get("obj")); - - engine.eval("obj.foo = 44;", context1); - engine.eval("print(obj.foo);", context1); - engine.eval("print(obj.foo);", context2); - } - - private static void test7() throws ScriptException { - NashornScriptEngine engine = createEngine(); - - engine.eval("var foo = 23;"); - - ScriptContext defaultContext = engine.getContext(); - Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context1 = new SimpleScriptContext(); - context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context2 = new SimpleScriptContext(); - context2.getBindings(ScriptContext.ENGINE_SCOPE).put("foo", defaultBindings.get("foo")); - - engine.eval("foo = 44;", context1); - engine.eval("print(foo);", context1); - engine.eval("print(foo);", context2); - } - - private static void test6() throws ScriptException { - NashornScriptEngine engine = createEngine(); - - ScriptContext defaultContext = engine.getContext(); - defaultContext.getBindings(ScriptContext.GLOBAL_SCOPE).put("foo", "hello"); - - ScriptContext customContext = new SimpleScriptContext(); - customContext.setBindings(defaultContext.getBindings(ScriptContext.ENGINE_SCOPE), ScriptContext.ENGINE_SCOPE); - - Bindings bindings = new SimpleBindings(); - bindings.put("foo", "world"); - customContext.setBindings(bindings, ScriptContext.GLOBAL_SCOPE); - -// engine.eval("foo = 23;"); // overrides foo in all contexts, why??? - - engine.eval("print(foo)"); // hello - engine.eval("print(foo)", customContext); // world - engine.eval("print(foo)", defaultContext); // hello - } - - private static void test5() throws ScriptException { - NashornScriptEngine engine = createEngine(); - - engine.eval("var obj = { foo: 'foo' };"); - engine.eval("function printFoo() { print(obj.foo) };"); - - ScriptContext defaultContext = engine.getContext(); - Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context1 = new SimpleScriptContext(); - context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context2 = new SimpleScriptContext(); - context2.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); - - engine.eval("obj.foo = 'bar';", context1); - engine.eval("printFoo();", context1); - engine.eval("printFoo();", context2); - } - - private static void test4() throws ScriptException { - NashornScriptEngine engine = createEngine(); - - engine.eval("function foo() { print('bar') };"); - - ScriptContext defaultContext = engine.getContext(); - Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context = new SimpleScriptContext(); - context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); - - engine.eval("foo();", context); - System.out.println(context.getAttribute("foo")); - } - - private static void test3() throws ScriptException { - NashornScriptEngine engine = createEngine(); - - ScriptContext defaultContext = engine.getContext(); - Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); - - SimpleScriptContext context = new SimpleScriptContext(); - context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); - - engine.eval("function foo() { print('bar') };", context); - engine.eval("foo();", context); - - Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE); - System.out.println(bindings.get("foo")); - System.out.println(context.getAttribute("foo")); - } - - private static void test2() throws ScriptException { - NashornScriptEngine engine = createEngine(); - engine.eval("function foo() { print('bar') };"); - - SimpleScriptContext context = new SimpleScriptContext(); - engine.eval("print(Function);", context); - engine.eval("foo();", context); - } - - private static void test1() throws ScriptException { - NashornScriptEngine engine = createEngine(); - engine.eval("function foo() { print('bar') };"); - engine.eval("foo();"); - } - - private static NashornScriptEngine createEngine() { - return (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn"); - } - -} diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn2.java b/src/com/winterbe/java8/samples/nashorn/Nashorn2.java deleted file mode 100644 index fcc36f94..00000000 --- a/src/com/winterbe/java8/samples/nashorn/Nashorn2.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.winterbe.java8.samples.nashorn; - -import jdk.nashorn.api.scripting.ScriptObjectMirror; - -import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; -import java.io.FileReader; -import java.util.Arrays; - -/** - * Calling java methods from javascript with nashorn. - * - * @author Benjamin Winterberg - */ -public class Nashorn2 { - - public static String fun(String name) { - System.out.format("Hi there from Java, %s", name); - return "greetings from java"; - } - - public static void fun2(Object object) { - System.out.println(object.getClass()); - } - - public static void fun3(ScriptObjectMirror mirror) { - System.out.println(mirror.getClassName() + ": " + Arrays.toString(mirror.getOwnKeys(true))); - } - - public static void fun4(ScriptObjectMirror person) { - System.out.println("Full Name is: " + person.callMember("getFullName")); - } - - public static void main(String[] args) throws Exception { - ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); - engine.eval(new FileReader("res/nashorn2.js")); - } - -} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/stream/Optional1.java b/src/com/winterbe/java8/samples/stream/Optional1.java deleted file mode 100644 index efd779e2..00000000 --- a/src/com/winterbe/java8/samples/stream/Optional1.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.winterbe.java8.samples.stream; - -import java.util.Optional; - -/** - * @author Benjamin Winterberg - */ -public class Optional1 { - - public static void main(String[] args) { - Optional optional = Optional.of("bam"); - - optional.isPresent(); // true - optional.get(); // "bam" - optional.orElse("fallback"); // "bam" - - optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b" - } - -} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/stream/Streams4.java b/src/com/winterbe/java8/samples/stream/Streams4.java deleted file mode 100644 index 78bf6f58..00000000 --- a/src/com/winterbe/java8/samples/stream/Streams4.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.winterbe.java8.samples.stream; - -import java.util.OptionalInt; -import java.util.stream.IntStream; - -/** - * @author Benjamin Winterberg - */ -public class Streams4 { - - public static void main(String[] args) { - for (int i = 0; i < 10; i++) { - if (i % 2 == 1) { - System.out.println(i); - } - } - - IntStream.range(0, 10) - .forEach(i -> { - if (i % 2 == 1) System.out.println(i); - }); - - IntStream.range(0, 10) - .filter(i -> i % 2 == 1) - .forEach(System.out::println); - - OptionalInt reduced1 = - IntStream.range(0, 10) - .reduce((a, b) -> a + b); - System.out.println(reduced1.getAsInt()); - - int reduced2 = - IntStream.range(0, 10) - .reduce(7, (a, b) -> a + b); - System.out.println(reduced2); - } -} diff --git a/src/com/winterbe/java8/samples/stream/Streams5.java b/src/com/winterbe/java8/samples/stream/Streams5.java deleted file mode 100644 index 560becf9..00000000 --- a/src/com/winterbe/java8/samples/stream/Streams5.java +++ /dev/null @@ -1,138 +0,0 @@ -package com.winterbe.java8.samples.stream; - -import java.util.Arrays; -import java.util.List; -import java.util.function.Supplier; -import java.util.stream.Stream; - -/** - * Testing the order of execution. - * - * @author Benjamin Winterberg - */ -public class Streams5 { - - public static void main(String[] args) { - List strings = - Arrays.asList("d2", "a2", "b1", "b3", "c"); - -// test1(strings); -// test2(strings); -// test3(strings); -// test4(strings); -// test5(strings); -// test6(strings); -// test7(strings); - test8(strings); - } - - private static void test8(List stringCollection) { - Supplier> streamSupplier = - () -> stringCollection - .stream() - .filter(s -> s.startsWith("a")); - - streamSupplier.get().anyMatch(s -> true); - streamSupplier.get().noneMatch(s -> true); - } - - // stream has already been operated upon or closed - private static void test7(List stringCollection) { - Stream stream = stringCollection - .stream() - .filter(s -> s.startsWith("a")); - - stream.anyMatch(s -> true); - stream.noneMatch(s -> true); - } - - // short-circuit - private static void test6(List stringCollection) { - stringCollection - .stream() - .map(s -> { - System.out.println("map: " + s); - return s.toUpperCase(); - }) - .anyMatch(s -> { - System.out.println("anyMatch: " + s); - return s.startsWith("A"); - }); - } - - private static void test5(List stringCollection) { - stringCollection - .stream() - .filter(s -> { - System.out.println("filter: " + s); - return s.toLowerCase().startsWith("a"); - }) - .sorted((s1, s2) -> { - System.out.printf("sort: %s; %s\n", s1, s2); - return s1.compareTo(s2); - }) - .map(s -> { - System.out.println("map: " + s); - return s.toUpperCase(); - }) - .forEach(s -> System.out.println("forEach: " + s)); - } - - // sorted = horizontal - private static void test4(List stringCollection) { - stringCollection - .stream() - .sorted((s1, s2) -> { - System.out.printf("sort: %s; %s\n", s1, s2); - return s1.compareTo(s2); - }) - .filter(s -> { - System.out.println("filter: " + s); - return s.toLowerCase().startsWith("a"); - }) - .map(s -> { - System.out.println("map: " + s); - return s.toUpperCase(); - }) - .forEach(s -> System.out.println("forEach: " + s)); - } - - private static void test3(List stringCollection) { - stringCollection - .stream() - .filter(s -> { - System.out.println("filter: " + s); - return s.startsWith("a"); - }) - .map(s -> { - System.out.println("map: " + s); - return s.toUpperCase(); - }) - .forEach(s -> System.out.println("forEach: " + s)); - } - - private static void test2(List stringCollection) { - stringCollection - .stream() - .map(s -> { - System.out.println("map: " + s); - return s.toUpperCase(); - }) - .filter(s -> { - System.out.println("filter: " + s); - return s.startsWith("A"); - }) - .forEach(s -> System.out.println("forEach: " + s)); - } - - private static void test1(List stringCollection) { - stringCollection - .stream() - .filter(s -> { - System.out.println("filter: " + s); - return true; - }) - .forEach(s -> System.out.println("forEach: " + s)); - } - -} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/concurrent/Atomic1.java b/src/main/java/com/winterbe/java8/samples/concurrent/AtomicIntegerDemo.java similarity index 63% rename from src/com/winterbe/java8/samples/concurrent/Atomic1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/AtomicIntegerDemo.java index 0f9d3cba..c5a56d48 100644 --- a/src/com/winterbe/java8/samples/concurrent/Atomic1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/AtomicIntegerDemo.java @@ -8,9 +8,9 @@ /** * @author Benjamin Winterberg */ -public class Atomic1 { +public class AtomicIntegerDemo { - private static final int NUM_INCREMENTS = 1000; + private static final int NUM_INCREMENTS = 10; private static AtomicInteger atomicInt = new AtomicInteger(0); @@ -22,49 +22,31 @@ public static void main(String[] args) { private static void testUpdate() { atomicInt.set(0); - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> { - Runnable task = () -> - atomicInt.updateAndGet(n -> n + 2); - executor.submit(task); - }); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> { + Runnable task = () -> atomicInt.updateAndGet(n -> n + 2); + executor.submit(task); + }); ConcurrentUtils.stop(executor); - System.out.format("Update: %d\n", atomicInt.get()); } private static void testAccumulate() { atomicInt.set(0); - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> { - Runnable task = () -> - atomicInt.accumulateAndGet(i, (n, m) -> n + m); - executor.submit(task); - }); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> { + Runnable task = () -> atomicInt.accumulateAndGet(i, (n, m) -> n + m); + executor.submit(task); + }); ConcurrentUtils.stop(executor); - System.out.format("Accumulate: %d\n", atomicInt.get()); } private static void testIncrement() { atomicInt.set(0); - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(atomicInt::incrementAndGet)); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(atomicInt::incrementAndGet)); ConcurrentUtils.stop(executor); - System.out.format("Increment: Expected=%d; Is=%d\n", NUM_INCREMENTS, atomicInt.get()); } - } diff --git a/src/com/winterbe/java8/samples/concurrent/CompletableFuture1.java b/src/main/java/com/winterbe/java8/samples/concurrent/CompletableFuture1.java similarity index 76% rename from src/com/winterbe/java8/samples/concurrent/CompletableFuture1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/CompletableFuture1.java index 82be5d75..70de21b9 100644 --- a/src/com/winterbe/java8/samples/concurrent/CompletableFuture1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/CompletableFuture1.java @@ -10,13 +10,7 @@ public class CompletableFuture1 { public static void main(String[] args) throws ExecutionException, InterruptedException { CompletableFuture future = new CompletableFuture<>(); - future.complete("42"); - - future - .thenAccept(System.out::println) - .thenAccept(v -> System.out.println("done")); - + future.thenAccept(System.out::println).thenAccept(v -> System.out.println("done: "+v)); } - } diff --git a/src/com/winterbe/java8/samples/concurrent/ConcurrentHashMap1.java b/src/main/java/com/winterbe/java8/samples/concurrent/ConcurrentHashMapDemo1.java similarity index 84% rename from src/com/winterbe/java8/samples/concurrent/ConcurrentHashMap1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/ConcurrentHashMapDemo1.java index 4acf79ab..4ee3eb4a 100644 --- a/src/com/winterbe/java8/samples/concurrent/ConcurrentHashMap1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/ConcurrentHashMapDemo1.java @@ -6,7 +6,7 @@ /** * @author Benjamin Winterberg */ -public class ConcurrentHashMap1 { +public class ConcurrentHashMapDemo1 { public static void main(String[] args) { System.out.println("Parallelism: " + ForkJoinPool.getCommonPoolParallelism()); @@ -23,8 +23,7 @@ private static void testReduce() { map.putIfAbsent("r2", "d2"); map.putIfAbsent("c3", "p0"); - String reduced = map.reduce(1, (key, value) -> key + "=" + value, - (s1, s2) -> s1 + ", " + s2); + String reduced = map.reduce(1, (key, value) -> key + "=" + value, (s1, s2) -> s1 + ", " + s2); System.out.println(reduced); } @@ -68,8 +67,10 @@ private static void testForEach() { map.putIfAbsent("r2", "d2"); map.putIfAbsent("c3", "p0"); - map.forEach(1, (key, value) -> System.out.printf("key: %s; value: %s; thread: %s\n", key, value, Thread.currentThread().getName())); -// map.forEach(5, (key, value) -> System.out.printf("key: %s; value: %s; thread: %s\n", key, value, Thread.currentThread().getName())); + map.forEach(1, + (key, value) -> System.out.printf("key: %s; value: %s; thread: %s\n", key, value, Thread.currentThread().getName())); + // map.forEach(5, (key, value) -> System.out.printf("key: %s; value: %s; thread: %s\n", key, + // value, Thread.currentThread().getName())); System.out.println(map.mappingCount()); } diff --git a/src/com/winterbe/java8/samples/concurrent/ConcurrentUtils.java b/src/main/java/com/winterbe/java8/samples/concurrent/ConcurrentUtils.java similarity index 91% rename from src/com/winterbe/java8/samples/concurrent/ConcurrentUtils.java rename to src/main/java/com/winterbe/java8/samples/concurrent/ConcurrentUtils.java index 86cfee8d..969e3007 100644 --- a/src/com/winterbe/java8/samples/concurrent/ConcurrentUtils.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/ConcurrentUtils.java @@ -12,11 +12,9 @@ public static void stop(ExecutorService executor) { try { executor.shutdown(); executor.awaitTermination(60, TimeUnit.SECONDS); - } - catch (InterruptedException e) { + } catch (InterruptedException e) { System.err.println("termination interrupted"); - } - finally { + } finally { if (!executor.isTerminated()) { System.err.println("killing non-finished tasks"); } diff --git a/src/com/winterbe/java8/samples/concurrent/LongAccumulator1.java b/src/main/java/com/winterbe/java8/samples/concurrent/LongAccumulator1.java similarity index 86% rename from src/com/winterbe/java8/samples/concurrent/LongAccumulator1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/LongAccumulator1.java index fa000a1b..adc82021 100644 --- a/src/com/winterbe/java8/samples/concurrent/LongAccumulator1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/LongAccumulator1.java @@ -8,6 +8,7 @@ /** * @author Benjamin Winterberg + * @Message 累加计算 */ public class LongAccumulator1 { @@ -18,14 +19,9 @@ public static void main(String[] args) { private static void testAccumulate() { LongBinaryOperator op = (x, y) -> 2 * x + y; LongAccumulator accumulator = new LongAccumulator(op, 1L); - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, 10) - .forEach(i -> executor.submit(() -> accumulator.accumulate(i))); - + IntStream.range(0, 3).forEach(i -> executor.submit(() -> accumulator.accumulate(i))); ConcurrentUtils.stop(executor); - System.out.format("Add: %d\n", accumulator.getThenReset()); } -} +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/concurrent/LongAdder1.java b/src/main/java/com/winterbe/java8/samples/concurrent/LongAdder1.java similarity index 76% rename from src/com/winterbe/java8/samples/concurrent/LongAdder1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/LongAdder1.java index 98cb1843..3fb70096 100644 --- a/src/com/winterbe/java8/samples/concurrent/LongAdder1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/LongAdder1.java @@ -10,8 +10,7 @@ */ public class LongAdder1 { - private static final int NUM_INCREMENTS = 10000; - + private static final int NUM_INCREMENTS = 3; private static LongAdder adder = new LongAdder(); public static void main(String[] args) { @@ -21,23 +20,15 @@ public static void main(String[] args) { private static void testAdd() { ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(() -> adder.add(2))); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(() -> adder.add(2))); ConcurrentUtils.stop(executor); - System.out.format("Add: %d\n", adder.sumThenReset()); } private static void testIncrement() { ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(adder::increment)); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(adder::increment)); ConcurrentUtils.stop(executor); - System.out.format("Increment: Expected=%d; Is=%d\n", NUM_INCREMENTS, adder.sumThenReset()); } } diff --git a/src/com/winterbe/java8/samples/concurrent/Threads1.java b/src/main/java/com/winterbe/java8/samples/concurrent/Threads1.java similarity index 86% rename from src/com/winterbe/java8/samples/concurrent/Threads1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/Threads1.java index 8a64f688..4cfd84a9 100644 --- a/src/com/winterbe/java8/samples/concurrent/Threads1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/Threads1.java @@ -8,19 +8,19 @@ public class Threads1 { public static void main(String[] args) { - test1(); -// test2(); -// test3(); +// test1(); +// test2(); + test3(); } + @SuppressWarnings("unused") private static void test3() { Runnable runnable = () -> { try { System.out.println("Foo " + Thread.currentThread().getName()); TimeUnit.SECONDS.sleep(1); System.out.println("Bar " + Thread.currentThread().getName()); - } - catch (InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); } }; @@ -29,14 +29,14 @@ private static void test3() { thread.start(); } + @SuppressWarnings("unused") private static void test2() { Runnable runnable = () -> { try { System.out.println("Foo " + Thread.currentThread().getName()); Thread.sleep(1000); System.out.println("Bar " + Thread.currentThread().getName()); - } - catch (InterruptedException e) { + } catch (InterruptedException e) { e.printStackTrace(); } }; diff --git a/src/com/winterbe/java8/samples/concurrent/Executors1.java b/src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors1SingleThread.java similarity index 79% rename from src/com/winterbe/java8/samples/concurrent/Executors1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors1SingleThread.java index 9762938d..e7784bab 100644 --- a/src/com/winterbe/java8/samples/concurrent/Executors1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors1SingleThread.java @@ -1,4 +1,4 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -6,12 +6,13 @@ /** * @author Benjamin Winterberg + * @Message support termination when thread running */ -public class Executors1 { +public class Executors1SingleThread { public static void main(String[] args) { - test1(3); -// test1(7); + test1(10); + // test1(7); } private static void test1(long seconds) { @@ -21,8 +22,7 @@ private static void test1(long seconds) { TimeUnit.SECONDS.sleep(seconds); String name = Thread.currentThread().getName(); System.out.println("task finished: " + name); - } - catch (InterruptedException e) { + } catch (InterruptedException e) { System.err.println("task interrupted"); } }); @@ -34,11 +34,9 @@ static void stop(ExecutorService executor) { System.out.println("attempt to shutdown executor"); executor.shutdown(); executor.awaitTermination(5, TimeUnit.SECONDS); - } - catch (InterruptedException e) { + } catch (InterruptedException e) { System.err.println("termination interrupted"); - } - finally { + } finally { if (!executor.isTerminated()) { System.err.println("killing non-finished tasks"); } @@ -46,4 +44,4 @@ static void stop(ExecutorService executor) { System.out.println("shutdown finished"); } } -} +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/concurrent/Executors2.java b/src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors2FixedThread.java similarity index 74% rename from src/com/winterbe/java8/samples/concurrent/Executors2.java rename to src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors2FixedThread.java index 33dda88e..10b2c800 100644 --- a/src/com/winterbe/java8/samples/concurrent/Executors2.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors2FixedThread.java @@ -1,4 +1,4 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.executor; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -9,12 +9,14 @@ /** * @author Benjamin Winterberg + * @Message future */ -public class Executors2 { +@SuppressWarnings("unused") +public class Executors2FixedThread { public static void main(String[] args) throws ExecutionException, InterruptedException, TimeoutException { -// test1(); -// test2(); + test1(); +// test2(); test3(); } @@ -23,15 +25,15 @@ private static void test3() throws InterruptedException, ExecutionException, Tim Future future = executor.submit(() -> { try { - TimeUnit.SECONDS.sleep(2); + TimeUnit.SECONDS.sleep(1); return 123; - } - catch (InterruptedException e) { + } catch (InterruptedException e) { throw new IllegalStateException("task interrupted", e); } }); - future.get(1, TimeUnit.SECONDS); + Integer integer = future.get(2, TimeUnit.SECONDS); + System.out.println("test 3 result : " + integer); } private static void test2() throws InterruptedException, ExecutionException { @@ -41,14 +43,14 @@ private static void test2() throws InterruptedException, ExecutionException { try { TimeUnit.SECONDS.sleep(1); return 123; - } - catch (InterruptedException e) { + } catch (InterruptedException e) { throw new IllegalStateException("task interrupted", e); } }); executor.shutdownNow(); - future.get(); + Integer integer = future.get(); + System.out.println("test2 result : " + integer); } private static void test1() throws InterruptedException, ExecutionException { @@ -58,20 +60,16 @@ private static void test1() throws InterruptedException, ExecutionException { try { TimeUnit.SECONDS.sleep(1); return 123; - } - catch (InterruptedException e) { + } catch (InterruptedException e) { throw new IllegalStateException("task interrupted", e); } }); System.out.println("future done: " + future.isDone()); - Integer result = future.get(); - System.out.println("future done: " + future.isDone()); - System.out.print("result: " + result); + System.out.println("test1 result: " + result); executor.shutdownNow(); } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Executors3.java b/src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors3ScheduledStealingThread.java similarity index 63% rename from src/com/winterbe/java8/samples/concurrent/Executors3.java rename to src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors3ScheduledStealingThread.java index 75e60377..a6c15a0d 100644 --- a/src/com/winterbe/java8/samples/concurrent/Executors3.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/executor/Executors3ScheduledStealingThread.java @@ -1,4 +1,4 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.executor; import java.util.Arrays; import java.util.List; @@ -12,25 +12,26 @@ /** * @author Benjamin Winterberg + * @Message stealing */ -public class Executors3 { +public class Executors3ScheduledStealingThread { public static void main(String[] args) throws InterruptedException, ExecutionException { - test1(); -// test2(); + test1(); + // test2(); // test3(); - -// test4(); +// test4(); // test5(); } + /** + * @Message 自动判断执行任何一个thread + */ + @SuppressWarnings("unused") private static void test5() throws InterruptedException, ExecutionException { ExecutorService executor = Executors.newWorkStealingPool(); - List> callables = Arrays.asList( - callable("task1", 2), - callable("task2", 1), - callable("task3", 3)); + List> callables = Arrays.asList(callable("task1", 9), callable("task2", 4), callable("task3", 3)); String result = executor.invokeAny(callables); System.out.println(result); @@ -45,45 +46,50 @@ private static Callable callable(String result, long sleepSeconds) { }; } + /** + * @Message 逐个执行 thread + * @throws InterruptedException + */ + @SuppressWarnings("unused") private static void test4() throws InterruptedException { ExecutorService executor = Executors.newWorkStealingPool(); - List> callables = Arrays.asList( - () -> "task1", - () -> "task2", - () -> "task3"); - - executor.invokeAll(callables) - .stream() - .map(future -> { - try { - return future.get(); - } - catch (Exception e) { - throw new IllegalStateException(e); - } - }) - .forEach(System.out::println); + List> callables = Arrays.asList(() -> "task1", () -> "task2", () -> "task3"); + + executor.invokeAll(callables).stream().map(future -> { + try { + return future.get(); + } catch (Exception e) { + throw new IllegalStateException(e); + } + }).forEach(System.out::println); executor.shutdown(); } + /** + * @Menssage 周期执行task + */ + @SuppressWarnings("unused") private static void test3() { ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); Runnable task = () -> { try { TimeUnit.SECONDS.sleep(2); - System.out.println("Scheduling: " + System.nanoTime()); - } - catch (InterruptedException e) { + System.out.println("Scheduling: " + System.nanoTime() + "," + System.currentTimeMillis()); + } catch (InterruptedException e) { System.err.println("task interrupted"); } }; - executor.scheduleWithFixedDelay(task, 0, 1, TimeUnit.SECONDS); + executor.scheduleWithFixedDelay(task, 0, 10, TimeUnit.SECONDS); } + /** + * delay and period + */ + @SuppressWarnings("unused") private static void test2() { ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); Runnable task = () -> System.out.println("Scheduling: " + System.nanoTime()); @@ -92,12 +98,16 @@ private static void test2() { executor.scheduleAtFixedRate(task, initialDelay, period, TimeUnit.SECONDS); } + /** + * @Message delay + * @throws InterruptedException + */ private static void test1() throws InterruptedException { ScheduledExecutorService executor = Executors.newScheduledThreadPool(1); Runnable task = () -> System.out.println("Scheduling: " + System.nanoTime()); int delay = 3; - ScheduledFuture> future = executor.schedule(task, delay, TimeUnit.SECONDS); + ScheduledFuture> future = executor.schedule(task, 3, TimeUnit.SECONDS); TimeUnit.MILLISECONDS.sleep(1337); diff --git a/src/com/winterbe/java8/samples/concurrent/Lock6.java b/src/main/java/com/winterbe/java8/samples/concurrent/lock/ConvertToWriteLockDemo.java similarity index 86% rename from src/com/winterbe/java8/samples/concurrent/Lock6.java rename to src/main/java/com/winterbe/java8/samples/concurrent/lock/ConvertToWriteLockDemo.java index a518b568..8f98833d 100644 --- a/src/com/winterbe/java8/samples/concurrent/Lock6.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/lock/ConvertToWriteLockDemo.java @@ -1,21 +1,21 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.lock; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.StampedLock; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Lock6 { +public class ConvertToWriteLockDemo { private static int count = 0; public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); - StampedLock lock = new StampedLock(); - executor.submit(() -> { long stamp = lock.readLock(); try { @@ -35,5 +35,4 @@ public static void main(String[] args) { ConcurrentUtils.stop(executor); } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Lock2.java b/src/main/java/com/winterbe/java8/samples/concurrent/lock/LambdaLock.java similarity index 86% rename from src/com/winterbe/java8/samples/concurrent/Lock2.java rename to src/main/java/com/winterbe/java8/samples/concurrent/lock/LambdaLock.java index 12757908..738a0686 100644 --- a/src/com/winterbe/java8/samples/concurrent/Lock2.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/lock/LambdaLock.java @@ -1,17 +1,18 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.lock; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Lock2 { +public class LambdaLock { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); - ReentrantLock lock = new ReentrantLock(); executor.submit(() -> { @@ -32,5 +33,4 @@ public static void main(String[] args) { ConcurrentUtils.stop(executor); } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Lock5.java b/src/main/java/com/winterbe/java8/samples/concurrent/lock/OptimisticLockDemo.java similarity index 86% rename from src/com/winterbe/java8/samples/concurrent/Lock5.java rename to src/main/java/com/winterbe/java8/samples/concurrent/lock/OptimisticLockDemo.java index 79802230..fc8b82ae 100644 --- a/src/com/winterbe/java8/samples/concurrent/Lock5.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/lock/OptimisticLockDemo.java @@ -1,17 +1,18 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.lock; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.StampedLock; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Lock5 { +public class OptimisticLockDemo { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); - StampedLock lock = new StampedLock(); executor.submit(() -> { @@ -20,7 +21,7 @@ public static void main(String[] args) { System.out.println("Optimistic Lock Valid: " + lock.validate(stamp)); ConcurrentUtils.sleep(1); System.out.println("Optimistic Lock Valid: " + lock.validate(stamp)); - ConcurrentUtils.sleep(2); + ConcurrentUtils.sleep(4); System.out.println("Optimistic Lock Valid: " + lock.validate(stamp)); } finally { lock.unlock(stamp); diff --git a/src/com/winterbe/java8/samples/concurrent/Lock3.java b/src/main/java/com/winterbe/java8/samples/concurrent/lock/ReadWriteLockDemo.java similarity index 85% rename from src/com/winterbe/java8/samples/concurrent/Lock3.java rename to src/main/java/com/winterbe/java8/samples/concurrent/lock/ReadWriteLockDemo.java index 5e24a49b..530c1244 100644 --- a/src/com/winterbe/java8/samples/concurrent/Lock3.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/lock/ReadWriteLockDemo.java @@ -1,4 +1,4 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.lock; import java.util.HashMap; import java.util.Map; @@ -7,22 +7,21 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Lock3 { +public class ReadWriteLockDemo { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); - Map map = new HashMap<>(); - ReadWriteLock lock = new ReentrantReadWriteLock(); - executor.submit(() -> { lock.writeLock().lock(); try { - ConcurrentUtils.sleep(1); + ConcurrentUtils.sleep(10); map.put("foo", "bar"); } finally { lock.writeLock().unlock(); @@ -43,5 +42,4 @@ public static void main(String[] args) { ConcurrentUtils.stop(executor); } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Lock1.java b/src/main/java/com/winterbe/java8/samples/concurrent/lock/ReentrantLockDemo.java similarity index 75% rename from src/com/winterbe/java8/samples/concurrent/Lock1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/lock/ReentrantLockDemo.java index d96eba3a..d1da35be 100644 --- a/src/com/winterbe/java8/samples/concurrent/Lock1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/lock/ReentrantLockDemo.java @@ -1,21 +1,25 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.lock; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.IntStream; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Lock1 { +public class ReentrantLockDemo { private static final int NUM_INCREMENTS = 10000; - private static ReentrantLock lock = new ReentrantLock(); - private static int count = 0; + public static void main(String[] args) { + testLock(); + } + private static void increment() { lock.lock(); try { @@ -25,20 +29,11 @@ private static void increment() { } } - public static void main(String[] args) { - testLock(); - } - private static void testLock() { count = 0; - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(Lock1::increment)); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(ReentrantLockDemo::increment)); ConcurrentUtils.stop(executor); - System.out.println(count); } diff --git a/src/com/winterbe/java8/samples/concurrent/Lock4.java b/src/main/java/com/winterbe/java8/samples/concurrent/lock/StampedLockDemo.java similarity index 83% rename from src/com/winterbe/java8/samples/concurrent/Lock4.java rename to src/main/java/com/winterbe/java8/samples/concurrent/lock/StampedLockDemo.java index 4061a694..a1da2376 100644 --- a/src/com/winterbe/java8/samples/concurrent/Lock4.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/lock/StampedLockDemo.java @@ -1,4 +1,4 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.lock; import java.util.HashMap; import java.util.Map; @@ -6,18 +6,17 @@ import java.util.concurrent.Executors; import java.util.concurrent.locks.StampedLock; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Lock4 { +public class StampedLockDemo { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(2); - Map map = new HashMap<>(); - StampedLock lock = new StampedLock(); - executor.submit(() -> { long stamp = lock.writeLock(); try { @@ -31,7 +30,7 @@ public static void main(String[] args) { Runnable readTask = () -> { long stamp = lock.readLock(); try { - System.out.println(map.get("foo")); + System.out.println("read: "+map.get("foo")); ConcurrentUtils.sleep(1); } finally { lock.unlockRead(stamp); @@ -42,5 +41,4 @@ public static void main(String[] args) { ConcurrentUtils.stop(executor); } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Semaphore1.java b/src/main/java/com/winterbe/java8/samples/concurrent/semaphore/SemaphoreDemo.java similarity index 76% rename from src/com/winterbe/java8/samples/concurrent/Semaphore1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/semaphore/SemaphoreDemo.java index 17f4c51a..5cb64cfd 100644 --- a/src/com/winterbe/java8/samples/concurrent/Semaphore1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/semaphore/SemaphoreDemo.java @@ -1,4 +1,4 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.semaphore; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -6,15 +6,15 @@ import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Semaphore1 { +public class SemaphoreDemo { private static final int NUM_INCREMENTS = 10000; - private static Semaphore semaphore = new Semaphore(1); - private static int count = 0; public static void main(String[] args) { @@ -23,12 +23,8 @@ public static void main(String[] args) { private static void testIncrement() { ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(Semaphore1::increment)); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(SemaphoreDemo::increment)); ConcurrentUtils.stop(executor); - System.out.println("Increment: " + count); } @@ -37,15 +33,12 @@ private static void increment() { try { permit = semaphore.tryAcquire(5, TimeUnit.SECONDS); count++; - } - catch (InterruptedException e) { + } catch (InterruptedException e) { throw new RuntimeException("could not increment"); - } - finally { + } finally { if (permit) { semaphore.release(); } } } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Semaphore2.java b/src/main/java/com/winterbe/java8/samples/concurrent/semaphore/SemaphoreDemo2.java similarity index 81% rename from src/com/winterbe/java8/samples/concurrent/Semaphore2.java rename to src/main/java/com/winterbe/java8/samples/concurrent/semaphore/SemaphoreDemo2.java index 23380594..b5fb7bc0 100644 --- a/src/com/winterbe/java8/samples/concurrent/Semaphore2.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/semaphore/SemaphoreDemo2.java @@ -1,4 +1,4 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.semaphore; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -6,19 +6,18 @@ import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ -public class Semaphore2 { +public class SemaphoreDemo2 { private static Semaphore semaphore = new Semaphore(5); public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(10); - - IntStream.range(0, 10) - .forEach(i -> executor.submit(Semaphore2::doWork)); - + IntStream.range(0, 10).forEach(i -> executor.submit(SemaphoreDemo2::doWork)); ConcurrentUtils.stop(executor); } @@ -40,5 +39,4 @@ private static void doWork() { } } } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Synchronized1.java b/src/main/java/com/winterbe/java8/samples/concurrent/synchronize/Synchronized1.java similarity index 75% rename from src/com/winterbe/java8/samples/concurrent/Synchronized1.java rename to src/main/java/com/winterbe/java8/samples/concurrent/synchronize/Synchronized1.java index c2a4e612..8cea6a77 100644 --- a/src/com/winterbe/java8/samples/concurrent/Synchronized1.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/synchronize/Synchronized1.java @@ -1,9 +1,11 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.synchronize; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.IntStream; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ @@ -20,27 +22,17 @@ public static void main(String[] args) { private static void testSyncIncrement() { count = 0; - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(Synchronized1::incrementSync)); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(Synchronized1::incrementSync)); ConcurrentUtils.stop(executor); - System.out.println(" Sync: " + count); } private static void testNonSyncIncrement() { count = 0; - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(Synchronized1::increment)); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(Synchronized1::increment)); ConcurrentUtils.stop(executor); - System.out.println("NonSync: " + count); } @@ -51,5 +43,4 @@ private static synchronized void incrementSync() { private static void increment() { count = count + 1; } - } diff --git a/src/com/winterbe/java8/samples/concurrent/Synchronized2.java b/src/main/java/com/winterbe/java8/samples/concurrent/synchronize/Synchronized2.java similarity index 75% rename from src/com/winterbe/java8/samples/concurrent/Synchronized2.java rename to src/main/java/com/winterbe/java8/samples/concurrent/synchronize/Synchronized2.java index 98b1879c..501c7a70 100644 --- a/src/com/winterbe/java8/samples/concurrent/Synchronized2.java +++ b/src/main/java/com/winterbe/java8/samples/concurrent/synchronize/Synchronized2.java @@ -1,16 +1,17 @@ -package com.winterbe.java8.samples.concurrent; +package com.winterbe.java8.samples.concurrent.synchronize; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.IntStream; +import com.winterbe.java8.samples.concurrent.ConcurrentUtils; + /** * @author Benjamin Winterberg */ public class Synchronized2 { private static final int NUM_INCREMENTS = 10000; - private static int count = 0; public static void main(String[] args) { @@ -19,14 +20,9 @@ public static void main(String[] args) { private static void testSyncIncrement() { count = 0; - ExecutorService executor = Executors.newFixedThreadPool(2); - - IntStream.range(0, NUM_INCREMENTS) - .forEach(i -> executor.submit(Synchronized2::incrementSync)); - + IntStream.range(0, NUM_INCREMENTS).forEach(i -> executor.submit(Synchronized2::incrementSync)); ConcurrentUtils.stop(executor); - System.out.println(count); } @@ -35,5 +31,4 @@ private static void incrementSync() { count = count + 1; } } - } diff --git a/src/com/winterbe/java8/samples/lambda/Lambda3.java b/src/main/java/com/winterbe/java8/samples/lambda/CommonFunctions.java similarity index 77% rename from src/com/winterbe/java8/samples/lambda/Lambda3.java rename to src/main/java/com/winterbe/java8/samples/lambda/CommonFunctions.java index 967f3493..c69bf23e 100644 --- a/src/com/winterbe/java8/samples/lambda/Lambda3.java +++ b/src/main/java/com/winterbe/java8/samples/lambda/CommonFunctions.java @@ -1,84 +1,80 @@ -package com.winterbe.java8.samples.lambda; - -import java.util.Comparator; -import java.util.Objects; -import java.util.UUID; -import java.util.concurrent.Callable; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Predicate; -import java.util.function.Supplier; - -/** - * Common standard functions from the Java API. - * - * @author Benjamin Winterberg - */ -public class Lambda3 { - - @FunctionalInterface - interface Fun { - void foo(); - } - - public static void main(String[] args) throws Exception { - - // Predicates - - Predicate predicate = (s) -> s.length() > 0; - - predicate.test("foo"); // true - predicate.negate().test("foo"); // false - - Predicate nonNull = Objects::nonNull; - Predicate isNull = Objects::isNull; - - Predicate isEmpty = String::isEmpty; - Predicate isNotEmpty = isEmpty.negate(); - - - // Functions - - Function toInteger = Integer::valueOf; - Function backToString = toInteger.andThen(String::valueOf); - - backToString.apply("123"); // "123" - - - // Suppliers - - Supplier personSupplier = Person::new; - personSupplier.get(); // new Person - - - // Consumers - - Consumer greeter = (p) -> System.out.println("Hello, " + p.firstName); - greeter.accept(new Person("Luke", "Skywalker")); - - - - // Comparators - - Comparator comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName); - - Person p1 = new Person("John", "Doe"); - Person p2 = new Person("Alice", "Wonderland"); - - comparator.compare(p1, p2); // > 0 - comparator.reversed().compare(p1, p2); // < 0 - - - // Runnables - - Runnable runnable = () -> System.out.println(UUID.randomUUID()); - runnable.run(); - - - // Callables - - Callable callable = UUID::randomUUID; - callable.call(); - } - -} +package com.winterbe.java8.samples.lambda; + +import java.util.Comparator; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.Callable; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.function.Supplier; + +/** + * Common standard functions from the Java API. + * + * @author Benjamin Winterberg + */ +public class CommonFunctions { + + @FunctionalInterface + interface Fun { + void foo(); + } + + public static void main(String[] args) throws Exception { + + // Predicates + Predicate predicate = (s) -> s.length() > 0; + + predicate.test("foo"); // true + predicate.negate().test("foo"); // false + + Predicate nonNull = Objects::nonNull; + nonNull.test(null); + + Predicate isNull = Objects::isNull; + isNull.test(null); + + Predicate isEmpty = String::isEmpty; + isEmpty.test(""); + + Predicate isNotEmpty = isEmpty.negate(); + isNotEmpty.test(""); + + // Functions + Function toInteger = Integer::valueOf; + Function backToString = toInteger.andThen(String::valueOf); + + backToString.apply("123"); // "123" + + // Suppliers + + Supplier personSupplier = Person::new; + personSupplier.get(); // new Person + + // Consumers + + Consumer greeter = (p) -> System.out.println("Hello, " + p.firstName); + greeter.accept(new Person("Luke", "Skywalker")); + + // Comparators + + Comparator comparator = (p1, p2) -> p1.firstName.compareTo(p2.firstName); + + Person p1 = new Person("John", "Doe"); + Person p2 = new Person("Alice", "Wonderland"); + + comparator.compare(p1, p2); // > 0 + comparator.reversed().compare(p1, p2); // < 0 + + // Runnables + + Runnable runnable = () -> System.out.println(UUID.randomUUID()); + runnable.run(); + + // Callables + + Callable callable = UUID::randomUUID; + callable.call(); + } +} diff --git a/src/com/winterbe/java8/samples/lambda/Lambda2.java b/src/main/java/com/winterbe/java8/samples/lambda/FunctionInterface.java similarity index 73% rename from src/com/winterbe/java8/samples/lambda/Lambda2.java rename to src/main/java/com/winterbe/java8/samples/lambda/FunctionInterface.java index 71e25ec7..c572ec29 100644 --- a/src/com/winterbe/java8/samples/lambda/Lambda2.java +++ b/src/main/java/com/winterbe/java8/samples/lambda/FunctionInterface.java @@ -2,8 +2,9 @@ /** * @author Benjamin Winterberg + * @Message 可用于实现逻辑与调用的分离,在一处对functionInterface进行定义,在另一处抽象调用 */ -public class Lambda2 { +public class FunctionInterface { @FunctionalInterface public static interface Converter { @@ -23,25 +24,22 @@ interface PersonFactory { public static void main(String[] args) { Converter integerConverter1 = (from) -> Integer.valueOf(from); Integer converted1 = integerConverter1.convert("123"); - System.out.println(converted1); // result: 123 - + System.out.println(converted1); // result: 123 // method reference - Converter integerConverter2 = Integer::valueOf; Integer converted2 = integerConverter2.convert("123"); - System.out.println(converted2); // result: 123 - + System.out.println(converted2); // result: 123 Something something = new Something(); Converter stringConverter = something::startsWith; String converted3 = stringConverter.convert("Java"); - System.out.println(converted3); // result J + System.out.println(converted3); // result J // constructor reference - PersonFactory personFactory = Person::new; Person person = personFactory.create("Peter", "Parker"); + System.out.println(person); // return Person [firstName=Peter,lastName=Parker] } } diff --git a/src/main/java/com/winterbe/java8/samples/lambda/InnerFunctionInterface.java b/src/main/java/com/winterbe/java8/samples/lambda/InnerFunctionInterface.java new file mode 100644 index 00000000..1a3ee678 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/InnerFunctionInterface.java @@ -0,0 +1,42 @@ +package com.winterbe.java8.samples.lambda; + +/** + * @author Benjamin Winterberg + * @Message 1、内部FunctionInterface用法,实现与调用分离;2、lamdba内部可以操作类成员变量 + */ +public class InnerFunctionInterface { + + private static int outerStaticNum; + + private int outerNum; + + void testScopes() { + int num = 1; + FunctionInterface.Converter stringConverter = (from) -> String.valueOf(from + num); + + String convert = stringConverter.convert(2); + System.out.println(convert); // 3 + + FunctionInterface.Converter stringConverter2 = (from) -> { + outerNum = 13; + return String.valueOf(from); + }; + + stringConverter2.convert(23); + System.out.println(outerNum);// 13 + + String[] array = new String[1]; + FunctionInterface.Converter stringConverter3 = (from) -> { + array[0] = "Hi there"; + return String.valueOf(from); + }; + + stringConverter3.convert(23); + System.out.println(array[0]);// Hi there + } + + public static void main(String[] args) { + new InnerFunctionInterface().testScopes(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/winterbe/java8/samples/lambda/InterfaceUsage.java b/src/main/java/com/winterbe/java8/samples/lambda/InterfaceUsage.java new file mode 100644 index 00000000..8f44cabe --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/InterfaceUsage.java @@ -0,0 +1,43 @@ +package com.winterbe.java8.samples.lambda; + +/** + * @author Benjamin Winterberg + * @Message interface default define;static define + */ +public class InterfaceUsage { + + public static void main(String[] args) { + Formula formula1 = new Formula() { + @Override + public double calculate(int a) { + return sqrt(a * 100); + } + }; + + double result1 = formula1.calculate(100); // 100.0 + double result2 = formula1.sqrt(-23); // 0.0 + int result3 = Formula.positive(-4); // 0.0 + + // Formula formula2 = (a) -> sqrt(a * 100); + + System.out.println(result1); + System.out.println(result2); + System.out.println(result3); + } +} + +/** + * can define function in a interface class; function can be static. + */ +interface Formula { + + double calculate(int a); + + default double sqrt(int a) { + return Math.sqrt(positive(a)); + } + + static int positive(int a) { + return a > 0 ? a : 0; + } +} \ No newline at end of file diff --git a/src/main/java/com/winterbe/java8/samples/lambda/LambdaArraySort.java b/src/main/java/com/winterbe/java8/samples/lambda/LambdaArraySort.java new file mode 100644 index 00000000..bdab419c --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/LambdaArraySort.java @@ -0,0 +1,80 @@ +package com.winterbe.java8.samples.lambda; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; + +/** + * @author Benjamin Winterberg + */ +public class LambdaArraySort { + + public static void main(String[] args) { + List names = Arrays.asList("peter", "anna", "mike", "xenia"); + lambda4Sort(names, Collections.reverseOrder()); + System.out.println(names); + + + usualSort(names); + System.out.println(names); + lambda1Sort(names); + System.out.println(names); + lambda2Sort(names); + System.out.println(names); + lambda3Sort(names); + System.out.println(names); + + + List names2 = Arrays.asList("peter", null, "anna", "mike", "xenia"); + lambda4Sort(names2, Comparator.nullsLast(String::compareTo)); + System.out.println(names2); + + + List names3 = Arrays.asList("2", "1"); + lambda5Sort(names3); + System.out.println(names3); + } + + private static void lambda5Sort(List names3) { + Optional.ofNullable(names3).ifPresent(list -> list.sort(Comparator.naturalOrder())); + } + + private static void lambda4Sort(List names2, Comparator c) { + names2.sort(c); + } + + /** + * simple + */ + private static void lambda3Sort(List names) { + Collections.sort(names, (a, b) -> a.compareTo(b)); + } + + /** + * parameter type + */ + private static void lambda2Sort(List names) { + Collections.sort(names, (String a, String b) -> b.compareTo(a)); + } + + /** + * method body + */ + private static void lambda1Sort(List names) { + Collections.sort(names, (String a, String b) -> { + return a.compareTo(b); + }); + } + + private static void usualSort(List names) { + Collections.sort(names, new Comparator() { + @Override + public int compare(String a, String b) { + return b.compareTo(a); + } + }); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/lambda/Lambda5.java b/src/main/java/com/winterbe/java8/samples/lambda/LambdaForEach.java similarity index 63% rename from src/com/winterbe/java8/samples/lambda/Lambda5.java rename to src/main/java/com/winterbe/java8/samples/lambda/LambdaForEach.java index 68a311f4..4997a18b 100644 --- a/src/com/winterbe/java8/samples/lambda/Lambda5.java +++ b/src/main/java/com/winterbe/java8/samples/lambda/LambdaForEach.java @@ -6,17 +6,16 @@ /** * Created by grijesh */ -public class Lambda5 { +public class LambdaForEach { //Pre-Defined Functional Interfaces public static void main(String... args) { //BiConsumer Example - BiConsumer printKeyAndValue - = (key,value) -> System.out.println(key+"-"+value); + BiConsumer printKeyAndValue = (key, value) -> System.out.println(key + "-" + value); - printKeyAndValue.accept("One",1); - printKeyAndValue.accept("Two",2); + printKeyAndValue.accept("One", 1); + printKeyAndValue.accept("Two", 2); System.out.println("##################"); @@ -26,7 +25,7 @@ public static void main(String... args) { dummyValues.put("Two", 2); dummyValues.put("Three", 3); - dummyValues.forEach((key,value) -> System.out.println(key+"-"+value)); + dummyValues.forEach((key, value) -> System.out.println(key + "-" + value)); } } diff --git a/src/main/java/com/winterbe/java8/samples/lambda/Person.java b/src/main/java/com/winterbe/java8/samples/lambda/Person.java new file mode 100644 index 00000000..f5108eb2 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/Person.java @@ -0,0 +1,29 @@ +package com.winterbe.java8.samples.lambda; + +/** + * @author Benjamin Winterberg + */ +public class Person { + public String firstName; + public String lastName; + + public Person() { + } + + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Person [firstName="); + builder.append(firstName); + builder.append(", lastName="); + builder.append(lastName); + builder.append("]"); + return builder.toString(); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/misc/Annotations1.java b/src/main/java/com/winterbe/java8/samples/misc/Annotations1.java similarity index 80% rename from src/com/winterbe/java8/samples/misc/Annotations1.java rename to src/main/java/com/winterbe/java8/samples/misc/Annotations1.java index ef54072d..4d379d4b 100644 --- a/src/com/winterbe/java8/samples/misc/Annotations1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Annotations1.java @@ -11,7 +11,7 @@ */ public class Annotations1 { - @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) + @Target({ ElementType.TYPE_PARAMETER, ElementType.TYPE_USE }) @interface MyAnnotation { } @@ -35,13 +35,13 @@ class Person { public static void main(String[] args) { Hint hint = Person.class.getAnnotation(Hint.class); - System.out.println(hint); // null + System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); - System.out.println(hints1.value().length); // 2 + System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); - System.out.println(hints2.length); // 2 + System.out.println(hints2.length); // 2 } } \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/misc/CheckedFunctions.java b/src/main/java/com/winterbe/java8/samples/misc/CheckedFunctions.java similarity index 94% rename from src/com/winterbe/java8/samples/misc/CheckedFunctions.java rename to src/main/java/com/winterbe/java8/samples/misc/CheckedFunctions.java index df8168a4..f566439e 100644 --- a/src/com/winterbe/java8/samples/misc/CheckedFunctions.java +++ b/src/main/java/com/winterbe/java8/samples/misc/CheckedFunctions.java @@ -38,8 +38,7 @@ public static Function function(CheckedFunction function) { return input -> { try { return function.apply(input); - } - catch (Exception e) { + } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } @@ -59,8 +58,7 @@ public static Predicate predicate(CheckedPredicate predicate) { return input -> { try { return predicate.test(input); - } - catch (Exception e) { + } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } @@ -80,8 +78,7 @@ public static Consumer consumer(CheckedConsumer consumer) { return input -> { try { consumer.accept(input); - } - catch (Exception e) { + } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } diff --git a/src/com/winterbe/java8/samples/misc/Concurrency1.java b/src/main/java/com/winterbe/java8/samples/misc/Concurrency1.java similarity index 99% rename from src/com/winterbe/java8/samples/misc/Concurrency1.java rename to src/main/java/com/winterbe/java8/samples/misc/Concurrency1.java index e7874e63..862a2c59 100644 --- a/src/com/winterbe/java8/samples/misc/Concurrency1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Concurrency1.java @@ -10,15 +10,12 @@ public class Concurrency1 { public static void main(String[] args) { ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); - for (int i = 0; i < 100; i++) { concurrentHashMap.put(i, UUID.randomUUID()); } int threshold = 1; - concurrentHashMap.forEachValue(threshold, System.out::println); - concurrentHashMap.forEach((id, uuid) -> { if (id % 10 == 0) { System.out.println(String.format("%s: %s", id, uuid)); @@ -31,7 +28,6 @@ public static void main(String[] args) { } return null; }); - System.out.println(searchResult); } } diff --git a/src/com/winterbe/java8/samples/misc/Files1.java b/src/main/java/com/winterbe/java8/samples/misc/Files1.java similarity index 74% rename from src/com/winterbe/java8/samples/misc/Files1.java rename to src/main/java/com/winterbe/java8/samples/misc/Files1.java index ece9dbea..add96d81 100644 --- a/src/com/winterbe/java8/samples/misc/Files1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Files1.java @@ -29,10 +29,7 @@ public static void main(String[] args) throws IOException { private static void testReaderLines() throws IOException { Path path = Paths.get("res/nashorn1.js"); try (BufferedReader reader = Files.newBufferedReader(path)) { - long countPrints = reader - .lines() - .filter(line -> line.contains("print")) - .count(); + long countPrints = reader.lines().filter(line -> line.contains("print")).count(); System.out.println(countPrints); } } @@ -55,9 +52,7 @@ private static void testWalk() throws IOException { Path start = Paths.get(""); int maxDepth = 5; try (Stream stream = Files.walk(start, maxDepth)) { - String joined = stream - .map(String::valueOf) - .filter(path -> path.endsWith(".js")) + String joined = stream.map(String::valueOf).filter(path -> path.endsWith(".js")) .collect(Collectors.joining("; ")); System.out.println("walk(): " + joined); } @@ -66,22 +61,15 @@ private static void testWalk() throws IOException { private static void testFind() throws IOException { Path start = Paths.get(""); int maxDepth = 5; - try (Stream stream = Files.find(start, maxDepth, (path, attr) -> - String.valueOf(path).endsWith(".js"))) { - String joined = stream - .sorted() - .map(String::valueOf) - .collect(Collectors.joining("; ")); + try (Stream stream = Files.find(start, maxDepth, (path, attr) -> String.valueOf(path).endsWith(".js"))) { + String joined = stream.sorted().map(String::valueOf).collect(Collectors.joining("; ")); System.out.println("find(): " + joined); } } private static void testList() throws IOException { try (Stream stream = Files.list(Paths.get(""))) { - String joined = stream - .map(String::valueOf) - .filter(path -> !path.startsWith(".")) - .sorted() + String joined = stream.map(String::valueOf).filter(path -> !path.startsWith(".")).sorted() .collect(Collectors.joining("; ")); System.out.println("list(): " + joined); } @@ -89,10 +77,7 @@ private static void testList() throws IOException { private static void testLines() throws IOException { try (Stream stream = Files.lines(Paths.get("res/nashorn1.js"))) { - stream - .filter(line -> line.contains("print")) - .map(String::trim) - .forEach(System.out::println); + stream.filter(line -> line.contains("print")).map(String::trim).forEach(System.out::println); } } @@ -101,4 +86,5 @@ private static void testReadWriteLines() throws IOException { lines.add("print('foobar');"); Files.write(Paths.get("res", "nashorn1-modified.js"), lines); } + } diff --git a/src/com/winterbe/java8/samples/misc/Maps1.java b/src/main/java/com/winterbe/java8/samples/misc/Maps1.java similarity index 59% rename from src/com/winterbe/java8/samples/misc/Maps1.java rename to src/main/java/com/winterbe/java8/samples/misc/Maps1.java index 1bc7b0dc..b5d6b486 100644 --- a/src/com/winterbe/java8/samples/misc/Maps1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Maps1.java @@ -17,32 +17,32 @@ public static void main(String[] args) { map.forEach((id, val) -> System.out.println(val)); - map.computeIfPresent(3, (num, val) -> val + num); - System.out.println(map.get(3)); // val33 + System.out.println(map.get(3)); // val33 + System.out.println(map.get(4));// val4 map.computeIfPresent(9, (num, val) -> null); - System.out.println(map.containsKey(9)); // false + System.out.println(map.containsKey(9)); // false map.computeIfAbsent(23, num -> "val" + num); - System.out.println(map.containsKey(23)); // true + System.out.println(map.containsKey(23)); // true map.computeIfAbsent(3, num -> "bam"); - System.out.println(map.get(3)); // val33 + System.out.println(map.get(3)); // val33 - System.out.println(map.getOrDefault(42, "not found")); // not found + System.out.println(map.getOrDefault(42, "not found")); // not found map.remove(3, "val3"); - System.out.println(map.get(3)); // val33 + System.out.println(map.get(3)); // val33 map.remove(3, "val33"); - System.out.println(map.get(3)); // null + System.out.println(map.get(3)); // null map.merge(9, "val9", (value, newValue) -> value.concat(newValue)); - System.out.println(map.get(9)); // val9 + System.out.println(map.get(9)); // val9 map.merge(9, "concat", (value, newValue) -> value.concat(newValue)); - System.out.println(map.get(9)); // val9concat + System.out.println(map.get(9)); // val9concat } } \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/misc/Math1.java b/src/main/java/com/winterbe/java8/samples/misc/Math1.java similarity index 86% rename from src/com/winterbe/java8/samples/misc/Math1.java rename to src/main/java/com/winterbe/java8/samples/misc/Math1.java index 2cebea8d..306521ca 100644 --- a/src/com/winterbe/java8/samples/misc/Math1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Math1.java @@ -13,8 +13,7 @@ public static void main(String[] args) { private static void testUnsignedInt() { try { Integer.parseUnsignedInt("-123", 10); - } - catch (NumberFormatException e) { + } catch (NumberFormatException e) { System.out.println(e.getMessage()); } @@ -31,8 +30,7 @@ private static void testUnsignedInt() { try { Integer.parseInt(string, 10); - } - catch (NumberFormatException e) { + } catch (NumberFormatException e) { System.err.println("could not parse signed int of " + maxUnsignedInt); } } @@ -43,15 +41,13 @@ private static void testMathExact() { try { Math.addExact(Integer.MAX_VALUE, 1); - } - catch (ArithmeticException e) { + } catch (ArithmeticException e) { System.err.println(e.getMessage()); } try { Math.toIntExact(Long.MAX_VALUE); - } - catch (ArithmeticException e) { + } catch (ArithmeticException e) { System.err.println(e.getMessage()); } } diff --git a/src/com/winterbe/java8/samples/misc/String1.java b/src/main/java/com/winterbe/java8/samples/misc/String1.java similarity index 60% rename from src/com/winterbe/java8/samples/misc/String1.java rename to src/main/java/com/winterbe/java8/samples/misc/String1.java index 0ba6ad8d..c4bc12bc 100644 --- a/src/com/winterbe/java8/samples/misc/String1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/String1.java @@ -10,35 +10,26 @@ public class String1 { public static void main(String[] args) { - testJoin(); + testChars(); - testPatternPredicate(); testPatternSplit(); + testPatternPredicate(); + testJoin(); } private static void testChars() { - String string = "foobar:foo:bar" - .chars() - .distinct() - .mapToObj(c -> String.valueOf((char) c)) - .sorted() - .collect(Collectors.joining()); + String string = "foobar:foo:bar".chars().distinct().mapToObj(c -> String.valueOf((char) c)).sorted().collect(Collectors.joining()); System.out.println(string); } private static void testPatternSplit() { - String string = Pattern.compile(":") - .splitAsStream("foobar:foo:bar") - .filter(s -> s.contains("bar")) - .sorted() - .collect(Collectors.joining(":")); + String string = Pattern.compile(":").splitAsStream("foobar:foo:bar") + .filter(s -> s.contains("bar")).sorted().collect(Collectors.joining(":")); System.out.println(string); } private static void testPatternPredicate() { - long count = Stream.of("bob@gmail.com", "alice@hotmail.com") - .filter(Pattern.compile(".*@gmail\\.com").asPredicate()) - .count(); + long count = Stream.of("bob@gmail.com", "alice@hotmail.com").filter(Pattern.compile(".*@gmail\\.com").asPredicate()).count(); System.out.println(count); } diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn1.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn1.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn1.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn1.java diff --git a/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn10.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn10.java new file mode 100644 index 00000000..9fc8772f --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn10.java @@ -0,0 +1,29 @@ +package com.winterbe.java8.samples.nashorn; + +import java.util.concurrent.TimeUnit; + +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import jdk.nashorn.api.scripting.NashornScriptEngine; + +/** + * @author Benjamin Winterberg + */ +@SuppressWarnings("restriction") +public class Nashorn10 { + + public static void main(String[] args) throws ScriptException, NoSuchMethodException { + NashornScriptEngine engine = (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn"); + engine.eval("load('res/nashorn10.js')"); + + long t0 = System.nanoTime(); + + for (int i = 0; i < 100000; i++) { + engine.invokeFunction("testPerf"); + } + + long took = System.nanoTime() - t0; + System.out.format("Elapsed time: %d ms", TimeUnit.NANOSECONDS.toMillis(took)); + } +} diff --git a/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn11.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn11.java new file mode 100644 index 00000000..f2ee994e --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn11.java @@ -0,0 +1,172 @@ +package com.winterbe.java8.samples.nashorn; + +import jdk.nashorn.api.scripting.NashornScriptEngine; + +import javax.script.Bindings; +import javax.script.ScriptContext; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import javax.script.SimpleBindings; +import javax.script.SimpleScriptContext; + +/** + * @author Benjamin Winterberg + */ +@SuppressWarnings("restriction") +public class Nashorn11 { + + public static void main(String[] args) throws Exception { + System.out.println("test1:"); + test1(); + System.out.println("test3:"); + test3(); + System.out.println("test4:"); + test4(); + System.out.println("test5:"); + test5(); + System.out.println("test6:"); + test6(); + System.out.println("test7:"); + test7(); + System.out.println("test8:"); + test8(); + System.out.println("test2:"); + test2(); + } + + private static void test8() throws ScriptException { + NashornScriptEngine engine = createEngine(); + engine.eval("var obj = { foo: 23 };"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context1 = new SimpleScriptContext(); + context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context2 = new SimpleScriptContext(); + context2.getBindings(ScriptContext.ENGINE_SCOPE).put("obj", defaultBindings.get("obj")); + + engine.eval("obj.foo = 44;", context1); + engine.eval("print(obj.foo);", context1); + engine.eval("print(obj.foo);", context2); + } + + private static void test7() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + engine.eval("var foo = 23;"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context1 = new SimpleScriptContext(); + context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context2 = new SimpleScriptContext(); + context2.getBindings(ScriptContext.ENGINE_SCOPE).put("foo", defaultBindings.get("foo")); + + engine.eval("foo = 44;", context1); + engine.eval("print(foo);", context1); + engine.eval("print(foo);", context2); + } + + private static void test6() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + ScriptContext defaultContext = engine.getContext(); + defaultContext.getBindings(ScriptContext.GLOBAL_SCOPE).put("foo", "hello"); + + ScriptContext customContext = new SimpleScriptContext(); + customContext.setBindings(defaultContext.getBindings(ScriptContext.ENGINE_SCOPE), ScriptContext.ENGINE_SCOPE); + + Bindings bindings = new SimpleBindings(); + bindings.put("foo", "world"); + customContext.setBindings(bindings, ScriptContext.GLOBAL_SCOPE); + + // engine.eval("foo = 23;"); // overrides foo in all contexts, why??? + + engine.eval("print(foo)"); // hello + engine.eval("print(foo)", customContext); // world + engine.eval("print(foo)", defaultContext); // hello + } + + private static void test5() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + engine.eval("var obj = { foo: 'foo' };"); + engine.eval("function printFoo() { print(obj.foo) };"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context1 = new SimpleScriptContext(); + context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context2 = new SimpleScriptContext(); + context2.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("obj.foo = 'bar';", context1); + engine.eval("printFoo();", context1); + engine.eval("printFoo();", context2); + } + + private static void test4() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + engine.eval("function foo() { print('bar') };"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context = new SimpleScriptContext(); + context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("foo();", context); + System.out.println(context.getAttribute("foo")); + } + + private static void test3() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context = new SimpleScriptContext(); + context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("function foo() { print('bar') };", context); + engine.eval("foo();", context); + + Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE); + System.out.println(bindings.get("foo")); + System.out.println(context.getAttribute("foo")); + } + + private static void test2() throws ScriptException { + NashornScriptEngine engine = createEngine(); + engine.eval("function foo() { print('bar') };"); + + SimpleScriptContext context = new SimpleScriptContext(); + + // must set bindings to context + // ScriptContext defaultContext = engine.getContext(); + // Bindings defaultBindings = + // defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + // context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("print(Function);", context); + engine.eval("foo();", context); + } + + private static void test1() throws ScriptException { + NashornScriptEngine engine = createEngine(); + engine.eval("function foo() { print('bar') };"); + engine.eval("foo();"); + } + + private static NashornScriptEngine createEngine() { + return (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn"); + } + +} diff --git a/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn2.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn2.java new file mode 100644 index 00000000..12611674 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn2.java @@ -0,0 +1,41 @@ +package com.winterbe.java8.samples.nashorn; + +import jdk.nashorn.api.scripting.ScriptObjectMirror; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; + +import java.io.FileReader; +import java.util.Arrays; + +/** + * Calling java methods from javascript with nashorn. + * + * @author Benjamin Winterberg + */ +@SuppressWarnings("restriction") +public class Nashorn2 { + + public static String fun(String name) { + System.out.format("Hi there from Java, %s", name); + return "greetings from java"; + } + + public static void fun2(Object object) { + System.out.println(object.getClass()); + } + + public static void fun3(ScriptObjectMirror mirror) { + System.out.println(mirror.getClassName() + ": " + Arrays.toString(mirror.getOwnKeys(true))); + } + + public static void fun4(ScriptObjectMirror person) { + System.out.println("Full Name is: " + person.callMember("getFullName")); + } + + public static void main(String[] args) throws Exception { + ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); + engine.eval(new FileReader("res/nashorn2.js")); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn3.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn3.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn3.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn3.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn4.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn4.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn4.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn4.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn5.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn5.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn5.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn5.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn6.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn6.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn6.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn6.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn7.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn7.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn7.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn7.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn8.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn8.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn8.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn8.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn9.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn9.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn9.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn9.java diff --git a/src/com/winterbe/java8/samples/nashorn/Product.java b/src/main/java/com/winterbe/java8/samples/nashorn/Product.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Product.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Product.java diff --git a/src/com/winterbe/java8/samples/nashorn/SuperRunner.java b/src/main/java/com/winterbe/java8/samples/nashorn/SuperRunner.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/SuperRunner.java rename to src/main/java/com/winterbe/java8/samples/nashorn/SuperRunner.java diff --git a/src/main/java/com/winterbe/java8/samples/optionals/Optional1.java b/src/main/java/com/winterbe/java8/samples/optionals/Optional1.java new file mode 100644 index 00000000..a9cd592e --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/optionals/Optional1.java @@ -0,0 +1,25 @@ +package com.winterbe.java8.samples.optionals; + +import java.util.Optional; + +/** + * @author Benjamin Winterberg + */ +public class Optional1 { + + public static void main(String[] args) { + Optional optional = Optional.of("bam"); + + System.out.println(optional.isPresent()); // true + System.out.println(optional.get()); // "bam" + System.out.println(optional.orElse("fallback")); // "bam" + + optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b" + + Optional optional2 = Optional.ofNullable("."); + + System.out.println(optional2.isPresent()); + System.out.println(optional2.get()); + System.out.println(optional2.orElse("fallback")); + } +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/stream/Optional2.java b/src/main/java/com/winterbe/java8/samples/optionals/Optional2.java similarity index 79% rename from src/com/winterbe/java8/samples/stream/Optional2.java rename to src/main/java/com/winterbe/java8/samples/optionals/Optional2.java index 920c82be..48b595c5 100644 --- a/src/com/winterbe/java8/samples/stream/Optional2.java +++ b/src/main/java/com/winterbe/java8/samples/optionals/Optional2.java @@ -1,11 +1,10 @@ -package com.winterbe.java8.samples.stream; +package com.winterbe.java8.samples.optionals; import java.util.Optional; import java.util.function.Supplier; /** * Examples how to avoid null checks with Optional: - * * http://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ * * @author Benjamin Winterberg @@ -46,24 +45,20 @@ public static Optional resolve(Supplier resolver) { try { T result = resolver.get(); return Optional.ofNullable(result); - } - catch (NullPointerException e) { + } catch (NullPointerException e) { return Optional.empty(); } } private static void test3() { Outer outer = new Outer(); - resolve(() -> outer.getNested().getInner().getFoo()) - .ifPresent(System.out::println); + resolve(() -> outer.getNested().getInner().getFoo()).ifPresent(System.out::println); } private static void test2() { Optional.of(new Outer()) - .map(Outer::getNested) - .map(Nested::getInner) - .map(Inner::getFoo) - .ifPresent(System.out::println); + .map(Outer::getNested).map(Nested::getInner) + .map(Inner::getFoo).ifPresent(System.out::println); } private static void test1() { diff --git a/src/com/winterbe/java8/samples/stream/Streams1.java b/src/main/java/com/winterbe/java8/samples/stream/Streams1.java similarity index 91% rename from src/com/winterbe/java8/samples/stream/Streams1.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams1.java index 8f438da4..7e5d198d 100644 --- a/src/com/winterbe/java8/samples/stream/Streams1.java +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams1.java @@ -23,7 +23,7 @@ public static void main(String[] args) { // filtering - + System.out.println("\ncollection.stream.sorted.filter.foreach"); stringCollection .stream() .filter((s) -> s.startsWith("a")) @@ -33,7 +33,7 @@ public static void main(String[] args) { // sorting - + System.out.println("\ncollection.stream.sorted.filter.foreach"); stringCollection .stream() .sorted() @@ -42,9 +42,8 @@ public static void main(String[] args) { // "aaa1", "aaa2" - + System.out.println("\ncollection.stream.map.sorted.foreach"); // mapping - stringCollection .stream() .map(String::toUpperCase) @@ -96,7 +95,5 @@ public static void main(String[] args) { reduced.ifPresent(System.out::println); // "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2" - } - } diff --git a/src/com/winterbe/java8/samples/stream/Streams10.java b/src/main/java/com/winterbe/java8/samples/stream/Streams10.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams10.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams10.java diff --git a/src/com/winterbe/java8/samples/stream/Streams11.java b/src/main/java/com/winterbe/java8/samples/stream/Streams11.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams11.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams11.java diff --git a/src/com/winterbe/java8/samples/stream/Streams12.java b/src/main/java/com/winterbe/java8/samples/stream/Streams12.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams12.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams12.java diff --git a/src/com/winterbe/java8/samples/stream/Streams13.java b/src/main/java/com/winterbe/java8/samples/stream/Streams13.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams13.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams13.java diff --git a/src/com/winterbe/java8/samples/stream/Streams2.java b/src/main/java/com/winterbe/java8/samples/stream/Streams2.java similarity index 98% rename from src/com/winterbe/java8/samples/stream/Streams2.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams2.java index 2569f500..faea6fc8 100644 --- a/src/com/winterbe/java8/samples/stream/Streams2.java +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams2.java @@ -20,18 +20,12 @@ public static void main(String[] args) { stringCollection.add("bbb2"); stringCollection.add("ddd1"); - // sorting - stringCollection .stream() .sorted() .forEach(System.out::println); System.out.println(stringCollection); - - - } - } diff --git a/src/com/winterbe/java8/samples/stream/Streams3.java b/src/main/java/com/winterbe/java8/samples/stream/Streams3.java similarity index 85% rename from src/com/winterbe/java8/samples/stream/Streams3.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams3.java index 694f6ddc..328cc0bc 100644 --- a/src/com/winterbe/java8/samples/stream/Streams3.java +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams3.java @@ -13,45 +13,40 @@ public class Streams3 { public static final int MAX = 1000000; public static void sortSequential() { - List values = new ArrayList<>(MAX); - for (int i = 0; i < MAX; i++) { - UUID uuid = UUID.randomUUID(); - values.add(uuid.toString()); - } + List values = getStrings(); // sequential - long t0 = System.nanoTime(); - long count = values.stream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); - long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("sequential sort took: %d ms", millis)); } public static void sortParallel() { - List values = new ArrayList<>(MAX); - for (int i = 0; i < MAX; i++) { - UUID uuid = UUID.randomUUID(); - values.add(uuid.toString()); - } - - // sequential + List values = getStrings(); + // Parallel long t0 = System.nanoTime(); - long count = values.parallelStream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); - long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("parallel sort took: %d ms", millis)); } + private static List getStrings() { + List values = new ArrayList<>(MAX); + for (int i = 0; i < MAX; i++) { + UUID uuid = UUID.randomUUID(); + values.add(uuid.toString()); + } + return values; + } + public static void main(String[] args) { sortSequential(); sortParallel(); diff --git a/src/main/java/com/winterbe/java8/samples/stream/Streams4.java b/src/main/java/com/winterbe/java8/samples/stream/Streams4.java new file mode 100644 index 00000000..c6572cb0 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams4.java @@ -0,0 +1,41 @@ +package com.winterbe.java8.samples.stream; + +import java.util.OptionalInt; +import java.util.stream.IntStream; + +/** + * @author Benjamin Winterberg + */ +public class Streams4 { + + public static void main(String[] args) { + + outprint("\nfor:"); + for (int i = 0; i < 10; i++) { + if (i % 2 == 1) { + System.out.println(i); + } + } + + outprint("\nforeach:"); + IntStream.range(0, 10).forEach(i -> { + if (i % 2 == 1) System.out.println(i); + }); + + outprint("\nforeach2:"); + IntStream.range(0, 10).filter(i -> i % 2 == 1).forEach(System.out::println); + + outprint("\nreduce:"); + OptionalInt reduced1 = IntStream.range(0, 10).reduce((a, b) -> a + b); + System.out.println(reduced1.getAsInt()); + + outprint("\nreduce2:"); + int reduced2 = IntStream.range(0, 10).reduce(6, (a, b) -> a + b); + System.out.println(reduced2); + } + + private static void outprint(String message) { + System.out.println(message); + } + +} diff --git a/src/main/java/com/winterbe/java8/samples/stream/Streams5.java b/src/main/java/com/winterbe/java8/samples/stream/Streams5.java new file mode 100644 index 00000000..d595efd3 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams5.java @@ -0,0 +1,136 @@ +package com.winterbe.java8.samples.stream; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Stream; + +/** + * Testing the order of execution. + * + * @author Benjamin Winterberg + */ +public class Streams5 { + + public static void main(String[] args) { + List strings = Arrays.asList("d2", "a2", "b1", "b3", "c"); + +// test1(strings); +// test2(strings); +// test3(strings); +// test4(strings); +// test5(strings); +// test6(strings); +// test7(strings); + test8(strings); + } + + private static void test8(List stringCollection) { + Supplier> streamSupplier = () -> stringCollection + .stream() + .filter(s -> s.startsWith("a")); + + streamSupplier.get().anyMatch(s -> true); + streamSupplier.get().noneMatch(s -> true); + } + + // stream has already been operated upon or closed + private static void test7(List stringCollection) { + Stream stream = stringCollection + .stream() + .filter(s -> s.startsWith("a")); + + stream.anyMatch(s -> true); + stream.noneMatch(s -> true); + } + + // short-circuit + private static void test6(List stringCollection) { + stringCollection + .stream() + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .anyMatch(s -> { + System.out.println("anyMatch: " + s); + return s.startsWith("A"); + }); + } + + private static void test5(List stringCollection) { + stringCollection + .stream() + .filter(s -> { + System.out.println("filter: " + s); + return s.toLowerCase().startsWith("a"); + }) + .sorted((s1, s2) -> { + System.out.printf("sort: %s; %s\n", s1, s2); + return s1.compareTo(s2); + }) + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + // sorted = horizontal + private static void test4(List stringCollection) { + stringCollection + .stream() + .sorted((s1, s2) -> { + System.out.printf("sort: %s; %s\n", s1, s2); + return s1.compareTo(s2); + }) + .filter(s -> { + System.out.println("filter: " + s); + return s.toLowerCase().startsWith("a"); + }) + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + private static void test3(List stringCollection) { + stringCollection + .stream() + .filter(s -> { + System.out.println("filter: " + s); + return s.startsWith("a"); + }) + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + private static void test2(List stringCollection) { + stringCollection + .stream() + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .filter(s -> { + System.out.println("filter: " + s); + return s.startsWith("A"); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + private static void test1(List stringCollection) { + stringCollection + .stream() + .filter(s -> { + System.out.println("filter: " + s); + return true; + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/stream/Streams6.java b/src/main/java/com/winterbe/java8/samples/stream/Streams6.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams6.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams6.java diff --git a/src/com/winterbe/java8/samples/stream/Streams7.java b/src/main/java/com/winterbe/java8/samples/stream/Streams7.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams7.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams7.java diff --git a/src/com/winterbe/java8/samples/stream/Streams8.java b/src/main/java/com/winterbe/java8/samples/stream/Streams8.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams8.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams8.java diff --git a/src/com/winterbe/java8/samples/stream/Streams9.java b/src/main/java/com/winterbe/java8/samples/stream/Streams9.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams9.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams9.java diff --git a/src/com/winterbe/java8/samples/time/LocalDate1.java b/src/main/java/com/winterbe/java8/samples/time/LocalDate1.java similarity index 71% rename from src/com/winterbe/java8/samples/time/LocalDate1.java rename to src/main/java/com/winterbe/java8/samples/time/LocalDate1.java index 9deed2a7..d81e1268 100644 --- a/src/com/winterbe/java8/samples/time/LocalDate1.java +++ b/src/main/java/com/winterbe/java8/samples/time/LocalDate1.java @@ -2,6 +2,7 @@ import java.time.DayOfWeek; import java.time.LocalDate; +import java.time.LocalTime; import java.time.Month; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; @@ -14,27 +15,21 @@ public class LocalDate1 { public static void main(String[] args) { + LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); - System.out.println(today); + System.out.println("today : "+today); System.out.println(tomorrow); System.out.println(yesterday); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); - System.out.println(dayOfWeek); // FRIDAY - - DateTimeFormatter germanFormatter = - DateTimeFormatter - .ofLocalizedDate(FormatStyle.MEDIUM) - .withLocale(Locale.GERMAN); + System.out.println("day of week : " + dayOfWeek); // FRIDAY + DateTimeFormatter germanFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); - System.out.println(xmas); // 2014-12-24 - - + System.out.println(xmas); // 2014-12-24 } - -} \ No newline at end of file +} diff --git a/src/com/winterbe/java8/samples/time/LocalDateTime1.java b/src/main/java/com/winterbe/java8/samples/time/LocalDateTime1.java similarity index 51% rename from src/com/winterbe/java8/samples/time/LocalDateTime1.java rename to src/main/java/com/winterbe/java8/samples/time/LocalDateTime1.java index 78134f5d..687acd13 100644 --- a/src/com/winterbe/java8/samples/time/LocalDateTime1.java +++ b/src/main/java/com/winterbe/java8/samples/time/LocalDateTime1.java @@ -19,29 +19,26 @@ public static void main(String[] args) { LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); - System.out.println(dayOfWeek); // WEDNESDAY + System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); - System.out.println(month); // DECEMBER + System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); - System.out.println(minuteOfDay); // 1439 + System.out.println(minuteOfDay); // 1439 - Instant instant = sylvester - .atZone(ZoneId.systemDefault()) - .toInstant(); + Instant instant = sylvester.atZone(ZoneId.systemDefault()).toInstant(); Date legacyDate = Date.from(instant); - System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 + System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy - HH:mm"); - DateTimeFormatter formatter = - DateTimeFormatter - .ofPattern("MMM dd, yyyy - HH:mm"); +// LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); +// String string = parsed.format(formatter); +// System.out.println(string); // Nov 03, 2014 - 07:13 - LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); - String string = parsed.format(formatter); - System.out.println(string); // Nov 03, 2014 - 07:13 + System.out.println(LocalDateTime.now()); } } \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/time/LocalTime1.java b/src/main/java/com/winterbe/java8/samples/time/LocalTime1.java similarity index 75% rename from src/com/winterbe/java8/samples/time/LocalTime1.java rename to src/main/java/com/winterbe/java8/samples/time/LocalTime1.java index 763a81ff..6df68317 100644 --- a/src/com/winterbe/java8/samples/time/LocalTime1.java +++ b/src/main/java/com/winterbe/java8/samples/time/LocalTime1.java @@ -24,7 +24,7 @@ public static void main(String[] args) { Instant instant = clock.instant(); Date legacyDate = Date.from(instant); - + System.out.println(legacyDate); ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); @@ -39,34 +39,26 @@ public static void main(String[] args) { System.out.println(now1); System.out.println(now2); - System.out.println(now1.isBefore(now2)); // false + System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); - System.out.println(hoursBetween); + System.out.println("hour between ="+hoursBetween); System.out.println(minutesBetween); - // create time LocalTime now = LocalTime.now(); - System.out.println(now); + System.out.println("localTime.now()=" + now); LocalTime late = LocalTime.of(23, 59, 59); - System.out.println(late); + System.out.println("localTime.of(23,59,59) = " + late); - DateTimeFormatter germanFormatter = - DateTimeFormatter - .ofLocalizedTime(FormatStyle.SHORT) - .withLocale(Locale.GERMAN); + DateTimeFormatter germanFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); - System.out.println(leetTime); - + System.out.println("localTime.parse = " + leetTime); // to legacy date - - } - } \ No newline at end of file
{ public static void main(String[] args) { Converter integerConverter1 = (from) -> Integer.valueOf(from); Integer converted1 = integerConverter1.convert("123"); - System.out.println(converted1); // result: 123 - + System.out.println(converted1); // result: 123 // method reference - Converter integerConverter2 = Integer::valueOf; Integer converted2 = integerConverter2.convert("123"); - System.out.println(converted2); // result: 123 - + System.out.println(converted2); // result: 123 Something something = new Something(); Converter stringConverter = something::startsWith; String converted3 = stringConverter.convert("Java"); - System.out.println(converted3); // result J + System.out.println(converted3); // result J // constructor reference - PersonFactory personFactory = Person::new; Person person = personFactory.create("Peter", "Parker"); + System.out.println(person); // return Person [firstName=Peter,lastName=Parker] } } diff --git a/src/main/java/com/winterbe/java8/samples/lambda/InnerFunctionInterface.java b/src/main/java/com/winterbe/java8/samples/lambda/InnerFunctionInterface.java new file mode 100644 index 00000000..1a3ee678 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/InnerFunctionInterface.java @@ -0,0 +1,42 @@ +package com.winterbe.java8.samples.lambda; + +/** + * @author Benjamin Winterberg + * @Message 1、内部FunctionInterface用法,实现与调用分离;2、lamdba内部可以操作类成员变量 + */ +public class InnerFunctionInterface { + + private static int outerStaticNum; + + private int outerNum; + + void testScopes() { + int num = 1; + FunctionInterface.Converter stringConverter = (from) -> String.valueOf(from + num); + + String convert = stringConverter.convert(2); + System.out.println(convert); // 3 + + FunctionInterface.Converter stringConverter2 = (from) -> { + outerNum = 13; + return String.valueOf(from); + }; + + stringConverter2.convert(23); + System.out.println(outerNum);// 13 + + String[] array = new String[1]; + FunctionInterface.Converter stringConverter3 = (from) -> { + array[0] = "Hi there"; + return String.valueOf(from); + }; + + stringConverter3.convert(23); + System.out.println(array[0]);// Hi there + } + + public static void main(String[] args) { + new InnerFunctionInterface().testScopes(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/winterbe/java8/samples/lambda/InterfaceUsage.java b/src/main/java/com/winterbe/java8/samples/lambda/InterfaceUsage.java new file mode 100644 index 00000000..8f44cabe --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/InterfaceUsage.java @@ -0,0 +1,43 @@ +package com.winterbe.java8.samples.lambda; + +/** + * @author Benjamin Winterberg + * @Message interface default define;static define + */ +public class InterfaceUsage { + + public static void main(String[] args) { + Formula formula1 = new Formula() { + @Override + public double calculate(int a) { + return sqrt(a * 100); + } + }; + + double result1 = formula1.calculate(100); // 100.0 + double result2 = formula1.sqrt(-23); // 0.0 + int result3 = Formula.positive(-4); // 0.0 + + // Formula formula2 = (a) -> sqrt(a * 100); + + System.out.println(result1); + System.out.println(result2); + System.out.println(result3); + } +} + +/** + * can define function in a interface class; function can be static. + */ +interface Formula { + + double calculate(int a); + + default double sqrt(int a) { + return Math.sqrt(positive(a)); + } + + static int positive(int a) { + return a > 0 ? a : 0; + } +} \ No newline at end of file diff --git a/src/main/java/com/winterbe/java8/samples/lambda/LambdaArraySort.java b/src/main/java/com/winterbe/java8/samples/lambda/LambdaArraySort.java new file mode 100644 index 00000000..bdab419c --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/LambdaArraySort.java @@ -0,0 +1,80 @@ +package com.winterbe.java8.samples.lambda; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; + +/** + * @author Benjamin Winterberg + */ +public class LambdaArraySort { + + public static void main(String[] args) { + List names = Arrays.asList("peter", "anna", "mike", "xenia"); + lambda4Sort(names, Collections.reverseOrder()); + System.out.println(names); + + + usualSort(names); + System.out.println(names); + lambda1Sort(names); + System.out.println(names); + lambda2Sort(names); + System.out.println(names); + lambda3Sort(names); + System.out.println(names); + + + List names2 = Arrays.asList("peter", null, "anna", "mike", "xenia"); + lambda4Sort(names2, Comparator.nullsLast(String::compareTo)); + System.out.println(names2); + + + List names3 = Arrays.asList("2", "1"); + lambda5Sort(names3); + System.out.println(names3); + } + + private static void lambda5Sort(List names3) { + Optional.ofNullable(names3).ifPresent(list -> list.sort(Comparator.naturalOrder())); + } + + private static void lambda4Sort(List names2, Comparator c) { + names2.sort(c); + } + + /** + * simple + */ + private static void lambda3Sort(List names) { + Collections.sort(names, (a, b) -> a.compareTo(b)); + } + + /** + * parameter type + */ + private static void lambda2Sort(List names) { + Collections.sort(names, (String a, String b) -> b.compareTo(a)); + } + + /** + * method body + */ + private static void lambda1Sort(List names) { + Collections.sort(names, (String a, String b) -> { + return a.compareTo(b); + }); + } + + private static void usualSort(List names) { + Collections.sort(names, new Comparator() { + @Override + public int compare(String a, String b) { + return b.compareTo(a); + } + }); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/lambda/Lambda5.java b/src/main/java/com/winterbe/java8/samples/lambda/LambdaForEach.java similarity index 63% rename from src/com/winterbe/java8/samples/lambda/Lambda5.java rename to src/main/java/com/winterbe/java8/samples/lambda/LambdaForEach.java index 68a311f4..4997a18b 100644 --- a/src/com/winterbe/java8/samples/lambda/Lambda5.java +++ b/src/main/java/com/winterbe/java8/samples/lambda/LambdaForEach.java @@ -6,17 +6,16 @@ /** * Created by grijesh */ -public class Lambda5 { +public class LambdaForEach { //Pre-Defined Functional Interfaces public static void main(String... args) { //BiConsumer Example - BiConsumer printKeyAndValue - = (key,value) -> System.out.println(key+"-"+value); + BiConsumer printKeyAndValue = (key, value) -> System.out.println(key + "-" + value); - printKeyAndValue.accept("One",1); - printKeyAndValue.accept("Two",2); + printKeyAndValue.accept("One", 1); + printKeyAndValue.accept("Two", 2); System.out.println("##################"); @@ -26,7 +25,7 @@ public static void main(String... args) { dummyValues.put("Two", 2); dummyValues.put("Three", 3); - dummyValues.forEach((key,value) -> System.out.println(key+"-"+value)); + dummyValues.forEach((key, value) -> System.out.println(key + "-" + value)); } } diff --git a/src/main/java/com/winterbe/java8/samples/lambda/Person.java b/src/main/java/com/winterbe/java8/samples/lambda/Person.java new file mode 100644 index 00000000..f5108eb2 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/lambda/Person.java @@ -0,0 +1,29 @@ +package com.winterbe.java8.samples.lambda; + +/** + * @author Benjamin Winterberg + */ +public class Person { + public String firstName; + public String lastName; + + public Person() { + } + + public Person(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("Person [firstName="); + builder.append(firstName); + builder.append(", lastName="); + builder.append(lastName); + builder.append("]"); + return builder.toString(); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/misc/Annotations1.java b/src/main/java/com/winterbe/java8/samples/misc/Annotations1.java similarity index 80% rename from src/com/winterbe/java8/samples/misc/Annotations1.java rename to src/main/java/com/winterbe/java8/samples/misc/Annotations1.java index ef54072d..4d379d4b 100644 --- a/src/com/winterbe/java8/samples/misc/Annotations1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Annotations1.java @@ -11,7 +11,7 @@ */ public class Annotations1 { - @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) + @Target({ ElementType.TYPE_PARAMETER, ElementType.TYPE_USE }) @interface MyAnnotation { } @@ -35,13 +35,13 @@ class Person { public static void main(String[] args) { Hint hint = Person.class.getAnnotation(Hint.class); - System.out.println(hint); // null + System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); - System.out.println(hints1.value().length); // 2 + System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); - System.out.println(hints2.length); // 2 + System.out.println(hints2.length); // 2 } } \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/misc/CheckedFunctions.java b/src/main/java/com/winterbe/java8/samples/misc/CheckedFunctions.java similarity index 94% rename from src/com/winterbe/java8/samples/misc/CheckedFunctions.java rename to src/main/java/com/winterbe/java8/samples/misc/CheckedFunctions.java index df8168a4..f566439e 100644 --- a/src/com/winterbe/java8/samples/misc/CheckedFunctions.java +++ b/src/main/java/com/winterbe/java8/samples/misc/CheckedFunctions.java @@ -38,8 +38,7 @@ public static Function function(CheckedFunction function) { return input -> { try { return function.apply(input); - } - catch (Exception e) { + } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } @@ -59,8 +58,7 @@ public static Predicate predicate(CheckedPredicate predicate) { return input -> { try { return predicate.test(input); - } - catch (Exception e) { + } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } @@ -80,8 +78,7 @@ public static Consumer consumer(CheckedConsumer consumer) { return input -> { try { consumer.accept(input); - } - catch (Exception e) { + } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException) e; } diff --git a/src/com/winterbe/java8/samples/misc/Concurrency1.java b/src/main/java/com/winterbe/java8/samples/misc/Concurrency1.java similarity index 99% rename from src/com/winterbe/java8/samples/misc/Concurrency1.java rename to src/main/java/com/winterbe/java8/samples/misc/Concurrency1.java index e7874e63..862a2c59 100644 --- a/src/com/winterbe/java8/samples/misc/Concurrency1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Concurrency1.java @@ -10,15 +10,12 @@ public class Concurrency1 { public static void main(String[] args) { ConcurrentHashMap concurrentHashMap = new ConcurrentHashMap<>(); - for (int i = 0; i < 100; i++) { concurrentHashMap.put(i, UUID.randomUUID()); } int threshold = 1; - concurrentHashMap.forEachValue(threshold, System.out::println); - concurrentHashMap.forEach((id, uuid) -> { if (id % 10 == 0) { System.out.println(String.format("%s: %s", id, uuid)); @@ -31,7 +28,6 @@ public static void main(String[] args) { } return null; }); - System.out.println(searchResult); } } diff --git a/src/com/winterbe/java8/samples/misc/Files1.java b/src/main/java/com/winterbe/java8/samples/misc/Files1.java similarity index 74% rename from src/com/winterbe/java8/samples/misc/Files1.java rename to src/main/java/com/winterbe/java8/samples/misc/Files1.java index ece9dbea..add96d81 100644 --- a/src/com/winterbe/java8/samples/misc/Files1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Files1.java @@ -29,10 +29,7 @@ public static void main(String[] args) throws IOException { private static void testReaderLines() throws IOException { Path path = Paths.get("res/nashorn1.js"); try (BufferedReader reader = Files.newBufferedReader(path)) { - long countPrints = reader - .lines() - .filter(line -> line.contains("print")) - .count(); + long countPrints = reader.lines().filter(line -> line.contains("print")).count(); System.out.println(countPrints); } } @@ -55,9 +52,7 @@ private static void testWalk() throws IOException { Path start = Paths.get(""); int maxDepth = 5; try (Stream stream = Files.walk(start, maxDepth)) { - String joined = stream - .map(String::valueOf) - .filter(path -> path.endsWith(".js")) + String joined = stream.map(String::valueOf).filter(path -> path.endsWith(".js")) .collect(Collectors.joining("; ")); System.out.println("walk(): " + joined); } @@ -66,22 +61,15 @@ private static void testWalk() throws IOException { private static void testFind() throws IOException { Path start = Paths.get(""); int maxDepth = 5; - try (Stream stream = Files.find(start, maxDepth, (path, attr) -> - String.valueOf(path).endsWith(".js"))) { - String joined = stream - .sorted() - .map(String::valueOf) - .collect(Collectors.joining("; ")); + try (Stream stream = Files.find(start, maxDepth, (path, attr) -> String.valueOf(path).endsWith(".js"))) { + String joined = stream.sorted().map(String::valueOf).collect(Collectors.joining("; ")); System.out.println("find(): " + joined); } } private static void testList() throws IOException { try (Stream stream = Files.list(Paths.get(""))) { - String joined = stream - .map(String::valueOf) - .filter(path -> !path.startsWith(".")) - .sorted() + String joined = stream.map(String::valueOf).filter(path -> !path.startsWith(".")).sorted() .collect(Collectors.joining("; ")); System.out.println("list(): " + joined); } @@ -89,10 +77,7 @@ private static void testList() throws IOException { private static void testLines() throws IOException { try (Stream stream = Files.lines(Paths.get("res/nashorn1.js"))) { - stream - .filter(line -> line.contains("print")) - .map(String::trim) - .forEach(System.out::println); + stream.filter(line -> line.contains("print")).map(String::trim).forEach(System.out::println); } } @@ -101,4 +86,5 @@ private static void testReadWriteLines() throws IOException { lines.add("print('foobar');"); Files.write(Paths.get("res", "nashorn1-modified.js"), lines); } + } diff --git a/src/com/winterbe/java8/samples/misc/Maps1.java b/src/main/java/com/winterbe/java8/samples/misc/Maps1.java similarity index 59% rename from src/com/winterbe/java8/samples/misc/Maps1.java rename to src/main/java/com/winterbe/java8/samples/misc/Maps1.java index 1bc7b0dc..b5d6b486 100644 --- a/src/com/winterbe/java8/samples/misc/Maps1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Maps1.java @@ -17,32 +17,32 @@ public static void main(String[] args) { map.forEach((id, val) -> System.out.println(val)); - map.computeIfPresent(3, (num, val) -> val + num); - System.out.println(map.get(3)); // val33 + System.out.println(map.get(3)); // val33 + System.out.println(map.get(4));// val4 map.computeIfPresent(9, (num, val) -> null); - System.out.println(map.containsKey(9)); // false + System.out.println(map.containsKey(9)); // false map.computeIfAbsent(23, num -> "val" + num); - System.out.println(map.containsKey(23)); // true + System.out.println(map.containsKey(23)); // true map.computeIfAbsent(3, num -> "bam"); - System.out.println(map.get(3)); // val33 + System.out.println(map.get(3)); // val33 - System.out.println(map.getOrDefault(42, "not found")); // not found + System.out.println(map.getOrDefault(42, "not found")); // not found map.remove(3, "val3"); - System.out.println(map.get(3)); // val33 + System.out.println(map.get(3)); // val33 map.remove(3, "val33"); - System.out.println(map.get(3)); // null + System.out.println(map.get(3)); // null map.merge(9, "val9", (value, newValue) -> value.concat(newValue)); - System.out.println(map.get(9)); // val9 + System.out.println(map.get(9)); // val9 map.merge(9, "concat", (value, newValue) -> value.concat(newValue)); - System.out.println(map.get(9)); // val9concat + System.out.println(map.get(9)); // val9concat } } \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/misc/Math1.java b/src/main/java/com/winterbe/java8/samples/misc/Math1.java similarity index 86% rename from src/com/winterbe/java8/samples/misc/Math1.java rename to src/main/java/com/winterbe/java8/samples/misc/Math1.java index 2cebea8d..306521ca 100644 --- a/src/com/winterbe/java8/samples/misc/Math1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/Math1.java @@ -13,8 +13,7 @@ public static void main(String[] args) { private static void testUnsignedInt() { try { Integer.parseUnsignedInt("-123", 10); - } - catch (NumberFormatException e) { + } catch (NumberFormatException e) { System.out.println(e.getMessage()); } @@ -31,8 +30,7 @@ private static void testUnsignedInt() { try { Integer.parseInt(string, 10); - } - catch (NumberFormatException e) { + } catch (NumberFormatException e) { System.err.println("could not parse signed int of " + maxUnsignedInt); } } @@ -43,15 +41,13 @@ private static void testMathExact() { try { Math.addExact(Integer.MAX_VALUE, 1); - } - catch (ArithmeticException e) { + } catch (ArithmeticException e) { System.err.println(e.getMessage()); } try { Math.toIntExact(Long.MAX_VALUE); - } - catch (ArithmeticException e) { + } catch (ArithmeticException e) { System.err.println(e.getMessage()); } } diff --git a/src/com/winterbe/java8/samples/misc/String1.java b/src/main/java/com/winterbe/java8/samples/misc/String1.java similarity index 60% rename from src/com/winterbe/java8/samples/misc/String1.java rename to src/main/java/com/winterbe/java8/samples/misc/String1.java index 0ba6ad8d..c4bc12bc 100644 --- a/src/com/winterbe/java8/samples/misc/String1.java +++ b/src/main/java/com/winterbe/java8/samples/misc/String1.java @@ -10,35 +10,26 @@ public class String1 { public static void main(String[] args) { - testJoin(); + testChars(); - testPatternPredicate(); testPatternSplit(); + testPatternPredicate(); + testJoin(); } private static void testChars() { - String string = "foobar:foo:bar" - .chars() - .distinct() - .mapToObj(c -> String.valueOf((char) c)) - .sorted() - .collect(Collectors.joining()); + String string = "foobar:foo:bar".chars().distinct().mapToObj(c -> String.valueOf((char) c)).sorted().collect(Collectors.joining()); System.out.println(string); } private static void testPatternSplit() { - String string = Pattern.compile(":") - .splitAsStream("foobar:foo:bar") - .filter(s -> s.contains("bar")) - .sorted() - .collect(Collectors.joining(":")); + String string = Pattern.compile(":").splitAsStream("foobar:foo:bar") + .filter(s -> s.contains("bar")).sorted().collect(Collectors.joining(":")); System.out.println(string); } private static void testPatternPredicate() { - long count = Stream.of("bob@gmail.com", "alice@hotmail.com") - .filter(Pattern.compile(".*@gmail\\.com").asPredicate()) - .count(); + long count = Stream.of("bob@gmail.com", "alice@hotmail.com").filter(Pattern.compile(".*@gmail\\.com").asPredicate()).count(); System.out.println(count); } diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn1.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn1.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn1.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn1.java diff --git a/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn10.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn10.java new file mode 100644 index 00000000..9fc8772f --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn10.java @@ -0,0 +1,29 @@ +package com.winterbe.java8.samples.nashorn; + +import java.util.concurrent.TimeUnit; + +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +import jdk.nashorn.api.scripting.NashornScriptEngine; + +/** + * @author Benjamin Winterberg + */ +@SuppressWarnings("restriction") +public class Nashorn10 { + + public static void main(String[] args) throws ScriptException, NoSuchMethodException { + NashornScriptEngine engine = (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn"); + engine.eval("load('res/nashorn10.js')"); + + long t0 = System.nanoTime(); + + for (int i = 0; i < 100000; i++) { + engine.invokeFunction("testPerf"); + } + + long took = System.nanoTime() - t0; + System.out.format("Elapsed time: %d ms", TimeUnit.NANOSECONDS.toMillis(took)); + } +} diff --git a/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn11.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn11.java new file mode 100644 index 00000000..f2ee994e --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn11.java @@ -0,0 +1,172 @@ +package com.winterbe.java8.samples.nashorn; + +import jdk.nashorn.api.scripting.NashornScriptEngine; + +import javax.script.Bindings; +import javax.script.ScriptContext; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; +import javax.script.SimpleBindings; +import javax.script.SimpleScriptContext; + +/** + * @author Benjamin Winterberg + */ +@SuppressWarnings("restriction") +public class Nashorn11 { + + public static void main(String[] args) throws Exception { + System.out.println("test1:"); + test1(); + System.out.println("test3:"); + test3(); + System.out.println("test4:"); + test4(); + System.out.println("test5:"); + test5(); + System.out.println("test6:"); + test6(); + System.out.println("test7:"); + test7(); + System.out.println("test8:"); + test8(); + System.out.println("test2:"); + test2(); + } + + private static void test8() throws ScriptException { + NashornScriptEngine engine = createEngine(); + engine.eval("var obj = { foo: 23 };"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context1 = new SimpleScriptContext(); + context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context2 = new SimpleScriptContext(); + context2.getBindings(ScriptContext.ENGINE_SCOPE).put("obj", defaultBindings.get("obj")); + + engine.eval("obj.foo = 44;", context1); + engine.eval("print(obj.foo);", context1); + engine.eval("print(obj.foo);", context2); + } + + private static void test7() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + engine.eval("var foo = 23;"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context1 = new SimpleScriptContext(); + context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context2 = new SimpleScriptContext(); + context2.getBindings(ScriptContext.ENGINE_SCOPE).put("foo", defaultBindings.get("foo")); + + engine.eval("foo = 44;", context1); + engine.eval("print(foo);", context1); + engine.eval("print(foo);", context2); + } + + private static void test6() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + ScriptContext defaultContext = engine.getContext(); + defaultContext.getBindings(ScriptContext.GLOBAL_SCOPE).put("foo", "hello"); + + ScriptContext customContext = new SimpleScriptContext(); + customContext.setBindings(defaultContext.getBindings(ScriptContext.ENGINE_SCOPE), ScriptContext.ENGINE_SCOPE); + + Bindings bindings = new SimpleBindings(); + bindings.put("foo", "world"); + customContext.setBindings(bindings, ScriptContext.GLOBAL_SCOPE); + + // engine.eval("foo = 23;"); // overrides foo in all contexts, why??? + + engine.eval("print(foo)"); // hello + engine.eval("print(foo)", customContext); // world + engine.eval("print(foo)", defaultContext); // hello + } + + private static void test5() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + engine.eval("var obj = { foo: 'foo' };"); + engine.eval("function printFoo() { print(obj.foo) };"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context1 = new SimpleScriptContext(); + context1.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context2 = new SimpleScriptContext(); + context2.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("obj.foo = 'bar';", context1); + engine.eval("printFoo();", context1); + engine.eval("printFoo();", context2); + } + + private static void test4() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + engine.eval("function foo() { print('bar') };"); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context = new SimpleScriptContext(); + context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("foo();", context); + System.out.println(context.getAttribute("foo")); + } + + private static void test3() throws ScriptException { + NashornScriptEngine engine = createEngine(); + + ScriptContext defaultContext = engine.getContext(); + Bindings defaultBindings = defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + + SimpleScriptContext context = new SimpleScriptContext(); + context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("function foo() { print('bar') };", context); + engine.eval("foo();", context); + + Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE); + System.out.println(bindings.get("foo")); + System.out.println(context.getAttribute("foo")); + } + + private static void test2() throws ScriptException { + NashornScriptEngine engine = createEngine(); + engine.eval("function foo() { print('bar') };"); + + SimpleScriptContext context = new SimpleScriptContext(); + + // must set bindings to context + // ScriptContext defaultContext = engine.getContext(); + // Bindings defaultBindings = + // defaultContext.getBindings(ScriptContext.ENGINE_SCOPE); + // context.setBindings(defaultBindings, ScriptContext.ENGINE_SCOPE); + + engine.eval("print(Function);", context); + engine.eval("foo();", context); + } + + private static void test1() throws ScriptException { + NashornScriptEngine engine = createEngine(); + engine.eval("function foo() { print('bar') };"); + engine.eval("foo();"); + } + + private static NashornScriptEngine createEngine() { + return (NashornScriptEngine) new ScriptEngineManager().getEngineByName("nashorn"); + } + +} diff --git a/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn2.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn2.java new file mode 100644 index 00000000..12611674 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn2.java @@ -0,0 +1,41 @@ +package com.winterbe.java8.samples.nashorn; + +import jdk.nashorn.api.scripting.ScriptObjectMirror; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; + +import java.io.FileReader; +import java.util.Arrays; + +/** + * Calling java methods from javascript with nashorn. + * + * @author Benjamin Winterberg + */ +@SuppressWarnings("restriction") +public class Nashorn2 { + + public static String fun(String name) { + System.out.format("Hi there from Java, %s", name); + return "greetings from java"; + } + + public static void fun2(Object object) { + System.out.println(object.getClass()); + } + + public static void fun3(ScriptObjectMirror mirror) { + System.out.println(mirror.getClassName() + ": " + Arrays.toString(mirror.getOwnKeys(true))); + } + + public static void fun4(ScriptObjectMirror person) { + System.out.println("Full Name is: " + person.callMember("getFullName")); + } + + public static void main(String[] args) throws Exception { + ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); + engine.eval(new FileReader("res/nashorn2.js")); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn3.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn3.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn3.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn3.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn4.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn4.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn4.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn4.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn5.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn5.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn5.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn5.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn6.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn6.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn6.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn6.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn7.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn7.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn7.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn7.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn8.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn8.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn8.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn8.java diff --git a/src/com/winterbe/java8/samples/nashorn/Nashorn9.java b/src/main/java/com/winterbe/java8/samples/nashorn/Nashorn9.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Nashorn9.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Nashorn9.java diff --git a/src/com/winterbe/java8/samples/nashorn/Product.java b/src/main/java/com/winterbe/java8/samples/nashorn/Product.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/Product.java rename to src/main/java/com/winterbe/java8/samples/nashorn/Product.java diff --git a/src/com/winterbe/java8/samples/nashorn/SuperRunner.java b/src/main/java/com/winterbe/java8/samples/nashorn/SuperRunner.java similarity index 100% rename from src/com/winterbe/java8/samples/nashorn/SuperRunner.java rename to src/main/java/com/winterbe/java8/samples/nashorn/SuperRunner.java diff --git a/src/main/java/com/winterbe/java8/samples/optionals/Optional1.java b/src/main/java/com/winterbe/java8/samples/optionals/Optional1.java new file mode 100644 index 00000000..a9cd592e --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/optionals/Optional1.java @@ -0,0 +1,25 @@ +package com.winterbe.java8.samples.optionals; + +import java.util.Optional; + +/** + * @author Benjamin Winterberg + */ +public class Optional1 { + + public static void main(String[] args) { + Optional optional = Optional.of("bam"); + + System.out.println(optional.isPresent()); // true + System.out.println(optional.get()); // "bam" + System.out.println(optional.orElse("fallback")); // "bam" + + optional.ifPresent((s) -> System.out.println(s.charAt(0))); // "b" + + Optional optional2 = Optional.ofNullable("."); + + System.out.println(optional2.isPresent()); + System.out.println(optional2.get()); + System.out.println(optional2.orElse("fallback")); + } +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/stream/Optional2.java b/src/main/java/com/winterbe/java8/samples/optionals/Optional2.java similarity index 79% rename from src/com/winterbe/java8/samples/stream/Optional2.java rename to src/main/java/com/winterbe/java8/samples/optionals/Optional2.java index 920c82be..48b595c5 100644 --- a/src/com/winterbe/java8/samples/stream/Optional2.java +++ b/src/main/java/com/winterbe/java8/samples/optionals/Optional2.java @@ -1,11 +1,10 @@ -package com.winterbe.java8.samples.stream; +package com.winterbe.java8.samples.optionals; import java.util.Optional; import java.util.function.Supplier; /** * Examples how to avoid null checks with Optional: - * * http://winterbe.com/posts/2015/03/15/avoid-null-checks-in-java/ * * @author Benjamin Winterberg @@ -46,24 +45,20 @@ public static Optional resolve(Supplier resolver) { try { T result = resolver.get(); return Optional.ofNullable(result); - } - catch (NullPointerException e) { + } catch (NullPointerException e) { return Optional.empty(); } } private static void test3() { Outer outer = new Outer(); - resolve(() -> outer.getNested().getInner().getFoo()) - .ifPresent(System.out::println); + resolve(() -> outer.getNested().getInner().getFoo()).ifPresent(System.out::println); } private static void test2() { Optional.of(new Outer()) - .map(Outer::getNested) - .map(Nested::getInner) - .map(Inner::getFoo) - .ifPresent(System.out::println); + .map(Outer::getNested).map(Nested::getInner) + .map(Inner::getFoo).ifPresent(System.out::println); } private static void test1() { diff --git a/src/com/winterbe/java8/samples/stream/Streams1.java b/src/main/java/com/winterbe/java8/samples/stream/Streams1.java similarity index 91% rename from src/com/winterbe/java8/samples/stream/Streams1.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams1.java index 8f438da4..7e5d198d 100644 --- a/src/com/winterbe/java8/samples/stream/Streams1.java +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams1.java @@ -23,7 +23,7 @@ public static void main(String[] args) { // filtering - + System.out.println("\ncollection.stream.sorted.filter.foreach"); stringCollection .stream() .filter((s) -> s.startsWith("a")) @@ -33,7 +33,7 @@ public static void main(String[] args) { // sorting - + System.out.println("\ncollection.stream.sorted.filter.foreach"); stringCollection .stream() .sorted() @@ -42,9 +42,8 @@ public static void main(String[] args) { // "aaa1", "aaa2" - + System.out.println("\ncollection.stream.map.sorted.foreach"); // mapping - stringCollection .stream() .map(String::toUpperCase) @@ -96,7 +95,5 @@ public static void main(String[] args) { reduced.ifPresent(System.out::println); // "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2" - } - } diff --git a/src/com/winterbe/java8/samples/stream/Streams10.java b/src/main/java/com/winterbe/java8/samples/stream/Streams10.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams10.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams10.java diff --git a/src/com/winterbe/java8/samples/stream/Streams11.java b/src/main/java/com/winterbe/java8/samples/stream/Streams11.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams11.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams11.java diff --git a/src/com/winterbe/java8/samples/stream/Streams12.java b/src/main/java/com/winterbe/java8/samples/stream/Streams12.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams12.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams12.java diff --git a/src/com/winterbe/java8/samples/stream/Streams13.java b/src/main/java/com/winterbe/java8/samples/stream/Streams13.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams13.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams13.java diff --git a/src/com/winterbe/java8/samples/stream/Streams2.java b/src/main/java/com/winterbe/java8/samples/stream/Streams2.java similarity index 98% rename from src/com/winterbe/java8/samples/stream/Streams2.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams2.java index 2569f500..faea6fc8 100644 --- a/src/com/winterbe/java8/samples/stream/Streams2.java +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams2.java @@ -20,18 +20,12 @@ public static void main(String[] args) { stringCollection.add("bbb2"); stringCollection.add("ddd1"); - // sorting - stringCollection .stream() .sorted() .forEach(System.out::println); System.out.println(stringCollection); - - - } - } diff --git a/src/com/winterbe/java8/samples/stream/Streams3.java b/src/main/java/com/winterbe/java8/samples/stream/Streams3.java similarity index 85% rename from src/com/winterbe/java8/samples/stream/Streams3.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams3.java index 694f6ddc..328cc0bc 100644 --- a/src/com/winterbe/java8/samples/stream/Streams3.java +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams3.java @@ -13,45 +13,40 @@ public class Streams3 { public static final int MAX = 1000000; public static void sortSequential() { - List values = new ArrayList<>(MAX); - for (int i = 0; i < MAX; i++) { - UUID uuid = UUID.randomUUID(); - values.add(uuid.toString()); - } + List values = getStrings(); // sequential - long t0 = System.nanoTime(); - long count = values.stream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); - long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("sequential sort took: %d ms", millis)); } public static void sortParallel() { - List values = new ArrayList<>(MAX); - for (int i = 0; i < MAX; i++) { - UUID uuid = UUID.randomUUID(); - values.add(uuid.toString()); - } - - // sequential + List values = getStrings(); + // Parallel long t0 = System.nanoTime(); - long count = values.parallelStream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); - long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("parallel sort took: %d ms", millis)); } + private static List getStrings() { + List values = new ArrayList<>(MAX); + for (int i = 0; i < MAX; i++) { + UUID uuid = UUID.randomUUID(); + values.add(uuid.toString()); + } + return values; + } + public static void main(String[] args) { sortSequential(); sortParallel(); diff --git a/src/main/java/com/winterbe/java8/samples/stream/Streams4.java b/src/main/java/com/winterbe/java8/samples/stream/Streams4.java new file mode 100644 index 00000000..c6572cb0 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams4.java @@ -0,0 +1,41 @@ +package com.winterbe.java8.samples.stream; + +import java.util.OptionalInt; +import java.util.stream.IntStream; + +/** + * @author Benjamin Winterberg + */ +public class Streams4 { + + public static void main(String[] args) { + + outprint("\nfor:"); + for (int i = 0; i < 10; i++) { + if (i % 2 == 1) { + System.out.println(i); + } + } + + outprint("\nforeach:"); + IntStream.range(0, 10).forEach(i -> { + if (i % 2 == 1) System.out.println(i); + }); + + outprint("\nforeach2:"); + IntStream.range(0, 10).filter(i -> i % 2 == 1).forEach(System.out::println); + + outprint("\nreduce:"); + OptionalInt reduced1 = IntStream.range(0, 10).reduce((a, b) -> a + b); + System.out.println(reduced1.getAsInt()); + + outprint("\nreduce2:"); + int reduced2 = IntStream.range(0, 10).reduce(6, (a, b) -> a + b); + System.out.println(reduced2); + } + + private static void outprint(String message) { + System.out.println(message); + } + +} diff --git a/src/main/java/com/winterbe/java8/samples/stream/Streams5.java b/src/main/java/com/winterbe/java8/samples/stream/Streams5.java new file mode 100644 index 00000000..d595efd3 --- /dev/null +++ b/src/main/java/com/winterbe/java8/samples/stream/Streams5.java @@ -0,0 +1,136 @@ +package com.winterbe.java8.samples.stream; + +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Stream; + +/** + * Testing the order of execution. + * + * @author Benjamin Winterberg + */ +public class Streams5 { + + public static void main(String[] args) { + List strings = Arrays.asList("d2", "a2", "b1", "b3", "c"); + +// test1(strings); +// test2(strings); +// test3(strings); +// test4(strings); +// test5(strings); +// test6(strings); +// test7(strings); + test8(strings); + } + + private static void test8(List stringCollection) { + Supplier> streamSupplier = () -> stringCollection + .stream() + .filter(s -> s.startsWith("a")); + + streamSupplier.get().anyMatch(s -> true); + streamSupplier.get().noneMatch(s -> true); + } + + // stream has already been operated upon or closed + private static void test7(List stringCollection) { + Stream stream = stringCollection + .stream() + .filter(s -> s.startsWith("a")); + + stream.anyMatch(s -> true); + stream.noneMatch(s -> true); + } + + // short-circuit + private static void test6(List stringCollection) { + stringCollection + .stream() + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .anyMatch(s -> { + System.out.println("anyMatch: " + s); + return s.startsWith("A"); + }); + } + + private static void test5(List stringCollection) { + stringCollection + .stream() + .filter(s -> { + System.out.println("filter: " + s); + return s.toLowerCase().startsWith("a"); + }) + .sorted((s1, s2) -> { + System.out.printf("sort: %s; %s\n", s1, s2); + return s1.compareTo(s2); + }) + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + // sorted = horizontal + private static void test4(List stringCollection) { + stringCollection + .stream() + .sorted((s1, s2) -> { + System.out.printf("sort: %s; %s\n", s1, s2); + return s1.compareTo(s2); + }) + .filter(s -> { + System.out.println("filter: " + s); + return s.toLowerCase().startsWith("a"); + }) + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + private static void test3(List stringCollection) { + stringCollection + .stream() + .filter(s -> { + System.out.println("filter: " + s); + return s.startsWith("a"); + }) + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + private static void test2(List stringCollection) { + stringCollection + .stream() + .map(s -> { + System.out.println("map: " + s); + return s.toUpperCase(); + }) + .filter(s -> { + System.out.println("filter: " + s); + return s.startsWith("A"); + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + + private static void test1(List stringCollection) { + stringCollection + .stream() + .filter(s -> { + System.out.println("filter: " + s); + return true; + }) + .forEach(s -> System.out.println("forEach: " + s)); + } + +} \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/stream/Streams6.java b/src/main/java/com/winterbe/java8/samples/stream/Streams6.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams6.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams6.java diff --git a/src/com/winterbe/java8/samples/stream/Streams7.java b/src/main/java/com/winterbe/java8/samples/stream/Streams7.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams7.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams7.java diff --git a/src/com/winterbe/java8/samples/stream/Streams8.java b/src/main/java/com/winterbe/java8/samples/stream/Streams8.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams8.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams8.java diff --git a/src/com/winterbe/java8/samples/stream/Streams9.java b/src/main/java/com/winterbe/java8/samples/stream/Streams9.java similarity index 100% rename from src/com/winterbe/java8/samples/stream/Streams9.java rename to src/main/java/com/winterbe/java8/samples/stream/Streams9.java diff --git a/src/com/winterbe/java8/samples/time/LocalDate1.java b/src/main/java/com/winterbe/java8/samples/time/LocalDate1.java similarity index 71% rename from src/com/winterbe/java8/samples/time/LocalDate1.java rename to src/main/java/com/winterbe/java8/samples/time/LocalDate1.java index 9deed2a7..d81e1268 100644 --- a/src/com/winterbe/java8/samples/time/LocalDate1.java +++ b/src/main/java/com/winterbe/java8/samples/time/LocalDate1.java @@ -2,6 +2,7 @@ import java.time.DayOfWeek; import java.time.LocalDate; +import java.time.LocalTime; import java.time.Month; import java.time.format.DateTimeFormatter; import java.time.format.FormatStyle; @@ -14,27 +15,21 @@ public class LocalDate1 { public static void main(String[] args) { + LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); - System.out.println(today); + System.out.println("today : "+today); System.out.println(tomorrow); System.out.println(yesterday); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); - System.out.println(dayOfWeek); // FRIDAY - - DateTimeFormatter germanFormatter = - DateTimeFormatter - .ofLocalizedDate(FormatStyle.MEDIUM) - .withLocale(Locale.GERMAN); + System.out.println("day of week : " + dayOfWeek); // FRIDAY + DateTimeFormatter germanFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); - System.out.println(xmas); // 2014-12-24 - - + System.out.println(xmas); // 2014-12-24 } - -} \ No newline at end of file +} diff --git a/src/com/winterbe/java8/samples/time/LocalDateTime1.java b/src/main/java/com/winterbe/java8/samples/time/LocalDateTime1.java similarity index 51% rename from src/com/winterbe/java8/samples/time/LocalDateTime1.java rename to src/main/java/com/winterbe/java8/samples/time/LocalDateTime1.java index 78134f5d..687acd13 100644 --- a/src/com/winterbe/java8/samples/time/LocalDateTime1.java +++ b/src/main/java/com/winterbe/java8/samples/time/LocalDateTime1.java @@ -19,29 +19,26 @@ public static void main(String[] args) { LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); - System.out.println(dayOfWeek); // WEDNESDAY + System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); - System.out.println(month); // DECEMBER + System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); - System.out.println(minuteOfDay); // 1439 + System.out.println(minuteOfDay); // 1439 - Instant instant = sylvester - .atZone(ZoneId.systemDefault()) - .toInstant(); + Instant instant = sylvester.atZone(ZoneId.systemDefault()).toInstant(); Date legacyDate = Date.from(instant); - System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 + System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd, yyyy - HH:mm"); - DateTimeFormatter formatter = - DateTimeFormatter - .ofPattern("MMM dd, yyyy - HH:mm"); +// LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); +// String string = parsed.format(formatter); +// System.out.println(string); // Nov 03, 2014 - 07:13 - LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); - String string = parsed.format(formatter); - System.out.println(string); // Nov 03, 2014 - 07:13 + System.out.println(LocalDateTime.now()); } } \ No newline at end of file diff --git a/src/com/winterbe/java8/samples/time/LocalTime1.java b/src/main/java/com/winterbe/java8/samples/time/LocalTime1.java similarity index 75% rename from src/com/winterbe/java8/samples/time/LocalTime1.java rename to src/main/java/com/winterbe/java8/samples/time/LocalTime1.java index 763a81ff..6df68317 100644 --- a/src/com/winterbe/java8/samples/time/LocalTime1.java +++ b/src/main/java/com/winterbe/java8/samples/time/LocalTime1.java @@ -24,7 +24,7 @@ public static void main(String[] args) { Instant instant = clock.instant(); Date legacyDate = Date.from(instant); - + System.out.println(legacyDate); ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); @@ -39,34 +39,26 @@ public static void main(String[] args) { System.out.println(now1); System.out.println(now2); - System.out.println(now1.isBefore(now2)); // false + System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); - System.out.println(hoursBetween); + System.out.println("hour between ="+hoursBetween); System.out.println(minutesBetween); - // create time LocalTime now = LocalTime.now(); - System.out.println(now); + System.out.println("localTime.now()=" + now); LocalTime late = LocalTime.of(23, 59, 59); - System.out.println(late); + System.out.println("localTime.of(23,59,59) = " + late); - DateTimeFormatter germanFormatter = - DateTimeFormatter - .ofLocalizedTime(FormatStyle.SHORT) - .withLocale(Locale.GERMAN); + DateTimeFormatter germanFormatter = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT).withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); - System.out.println(leetTime); - + System.out.println("localTime.parse = " + leetTime); // to legacy date - - } - } \ No newline at end of file