From 89fc5b3d0efe03727ca674723b386463317a5547 Mon Sep 17 00:00:00 2001 From: Kenneth Kousen Date: Sun, 20 Sep 2015 08:48:25 -0400 Subject: [PATCH 1/5] Update from conference --- README.md | 4 +++ .../nfjs/collections/MapConversion.java | 7 ++++- .../groovy/nfjs/collections/PersonDemo.java | 17 +++++++---- src/main/groovy/nfjs/collections/Sorter.java | 8 ++---- .../nfjs/collections/StringSamples.groovy | 3 -- .../nfjs/collections/TaskSamples.groovy | 3 -- src/main/groovy/nfjs/datetime/UseInstant.java | 6 ++-- src/main/groovy/nfjs/lambdas/AssignDemo.java | 28 +++++++++++++++++++ .../groovy/nfjs/optionals/UseDepartment.java | 7 +++++ .../groovy/nfjs/streams/GenerateStreams.java | 6 ++-- .../groovy/nfjs/streams/InfiniteStream.java | 13 +++++++++ .../nfjs/streams/ProcessDictionary.java | 5 ++-- 12 files changed, 81 insertions(+), 26 deletions(-) create mode 100644 src/main/groovy/nfjs/lambdas/AssignDemo.java create mode 100644 src/main/groovy/nfjs/streams/InfiniteStream.java diff --git a/README.md b/README.md index f8652d9..467c303 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # java8 Sample code for "New Features in Java 8" talk + +Good reference: + +Java 8 for the Really Impatient by Cay Horstmann \ No newline at end of file diff --git a/src/main/groovy/nfjs/collections/MapConversion.java b/src/main/groovy/nfjs/collections/MapConversion.java index efa8b53..8acf766 100644 --- a/src/main/groovy/nfjs/collections/MapConversion.java +++ b/src/main/groovy/nfjs/collections/MapConversion.java @@ -1,14 +1,19 @@ package nfjs.collections; +import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.stream.Collectors; public class MapConversion { public static void main(String[] args) { - Map taskMap = TaskSamples.getSampleTasks() + List sampleTasks = TaskSamples.getSampleTasks(); + + Map taskMap = sampleTasks .stream() .collect(Collectors.toMap(Task::getId, Function.identity())); System.out.println(taskMap); + + } } diff --git a/src/main/groovy/nfjs/collections/PersonDemo.java b/src/main/groovy/nfjs/collections/PersonDemo.java index f0d9d5b..51bac83 100644 --- a/src/main/groovy/nfjs/collections/PersonDemo.java +++ b/src/main/groovy/nfjs/collections/PersonDemo.java @@ -5,18 +5,25 @@ import java.util.List; import java.util.stream.Collectors; -/** - * Created by kousen on 3/5/15. - */ public class PersonDemo { public List createPeople() { - return StringSamples.getSampleNames().stream() + return StringSamples.getSampleNames() + .stream() .map(Person::new) .collect(Collectors.toList()); } + public List createTwoArgPeople() { + return StringSamples.getSampleNames() + .stream() + .map(s -> s.split(" ")) + .map(s1 -> new Person(s1[0], s1[1])) + .collect(Collectors.toList()); + } + public Person[] createPeopleArray() { - return StringSamples.getSampleNames().stream() + return StringSamples.getSampleNames() + .stream() .map(Person::new) .toArray(Person[]::new); } diff --git a/src/main/groovy/nfjs/collections/Sorter.java b/src/main/groovy/nfjs/collections/Sorter.java index f9584b8..3ea46d9 100644 --- a/src/main/groovy/nfjs/collections/Sorter.java +++ b/src/main/groovy/nfjs/collections/Sorter.java @@ -9,12 +9,8 @@ public class Sorter { public List sortWithComparator() { List sampleStrings = StringSamples.getSampleStrings(); - Collections.sort(sampleStrings, new Comparator() { - @Override - public int compare(String s1, String s2) { - return s1.length() - s2.length(); - } - }); + Collections.sort(sampleStrings, + (s1, s2) -> s1.length() - s2.length()); return sampleStrings; } diff --git a/src/main/groovy/nfjs/collections/StringSamples.groovy b/src/main/groovy/nfjs/collections/StringSamples.groovy index 29eb7ff..14345fc 100644 --- a/src/main/groovy/nfjs/collections/StringSamples.groovy +++ b/src/main/groovy/nfjs/collections/StringSamples.groovy @@ -1,8 +1,5 @@ package nfjs.collections -/** - * Created by kousen on 3/5/15. - */ class StringSamples { static List getSampleStrings() { 'this is a list of strings'.split() diff --git a/src/main/groovy/nfjs/collections/TaskSamples.groovy b/src/main/groovy/nfjs/collections/TaskSamples.groovy index 2518aad..2f40321 100644 --- a/src/main/groovy/nfjs/collections/TaskSamples.groovy +++ b/src/main/groovy/nfjs/collections/TaskSamples.groovy @@ -1,8 +1,5 @@ package nfjs.collections -/** - * Created by kousen on 3/8/15. - */ class TaskSamples { static List getSampleTasks() { [new Task(id: 1, active: true, duration: 3, diff --git a/src/main/groovy/nfjs/datetime/UseInstant.java b/src/main/groovy/nfjs/datetime/UseInstant.java index 387a66b..b9a26d1 100644 --- a/src/main/groovy/nfjs/datetime/UseInstant.java +++ b/src/main/groovy/nfjs/datetime/UseInstant.java @@ -9,7 +9,7 @@ public class UseInstant { public static void main(String[] args) { - Instant now = Instant.now(); +/* Instant now = Instant.now(); System.out.println(now); Instant then = now.plus(1, ChronoUnit.DAYS); @@ -26,7 +26,7 @@ public static void main(String[] args) { .plusMillis(100) .plusNanos(100); System.out.println(then); - +*/ LocalDate date1 = LocalDate.now(); System.out.println(date1); @@ -69,7 +69,5 @@ public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG) .withLocale(Locale.FRANCE); System.out.println(formatter.format(spring)); - - } } diff --git a/src/main/groovy/nfjs/lambdas/AssignDemo.java b/src/main/groovy/nfjs/lambdas/AssignDemo.java new file mode 100644 index 0000000..449c86a --- /dev/null +++ b/src/main/groovy/nfjs/lambdas/AssignDemo.java @@ -0,0 +1,28 @@ +package nfjs.lambdas; + +import java.util.Arrays; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class AssignDemo { + public static void main(String[] args) { + Arrays.asList(3, 1, 4, 1, 5, 9) + .forEach(System.out::println); + + Consumer printer = System.out::println; + Arrays.asList(3, 1, 4, 1, 5, 9) + .forEach(printer); + + Arrays.asList(3, 1, 4, 1, 5, 9) + .stream() + .filter(x -> x % 3 == 0) + .forEach(System.out::println); + + Predicate mod3 = x -> x % 3 == 0; + Arrays.asList(3, 1, 4, 1, 5, 9) + .stream() + .filter(mod3) + .forEach(System.out::println); + + } +} diff --git a/src/main/groovy/nfjs/optionals/UseDepartment.java b/src/main/groovy/nfjs/optionals/UseDepartment.java index 71b3b12..4b40cd8 100644 --- a/src/main/groovy/nfjs/optionals/UseDepartment.java +++ b/src/main/groovy/nfjs/optionals/UseDepartment.java @@ -1,5 +1,7 @@ package nfjs.optionals; +import java.util.HashMap; +import java.util.Map; import java.util.Optional; public class UseDepartment { @@ -28,5 +30,10 @@ public static void main(String[] args) { .map(Manager::getName) .orElse("Unknown") ); + + String name = "Mal Reynolds"; + Map managers = new HashMap<>(); + Manager manager = managers.computeIfAbsent(name, Manager::new); + System.out.println(managers); } } diff --git a/src/main/groovy/nfjs/streams/GenerateStreams.java b/src/main/groovy/nfjs/streams/GenerateStreams.java index 29181d0..34a732f 100644 --- a/src/main/groovy/nfjs/streams/GenerateStreams.java +++ b/src/main/groovy/nfjs/streams/GenerateStreams.java @@ -6,12 +6,14 @@ public class GenerateStreams { public static void main(String[] args) { - Stream stringStream = Stream.of("this", "is", "a", "stream", "of", "strings"); + Stream stringStream = + Stream.of("this", "is", "a", "stream", "of", "strings"); Stream doubles = Stream.generate(Math::random) .limit(1000); - Stream nums = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE)); + Stream nums = Stream.iterate(BigInteger.ZERO, + n -> n.add(BigInteger.ONE)); } diff --git a/src/main/groovy/nfjs/streams/InfiniteStream.java b/src/main/groovy/nfjs/streams/InfiniteStream.java new file mode 100644 index 0000000..0b2b93f --- /dev/null +++ b/src/main/groovy/nfjs/streams/InfiniteStream.java @@ -0,0 +1,13 @@ +package nfjs.streams; + +import java.util.stream.Stream; + +public class InfiniteStream { + public static void main(String[] args) { + double sum = Stream.generate(Math::random) + .mapToDouble(Double::doubleValue) + .limit(1000) + .sum(); + System.out.printf("The total is %s%n", sum); + } +} diff --git a/src/main/groovy/nfjs/streams/ProcessDictionary.java b/src/main/groovy/nfjs/streams/ProcessDictionary.java index 45c1dd5..ea32f2c 100644 --- a/src/main/groovy/nfjs/streams/ProcessDictionary.java +++ b/src/main/groovy/nfjs/streams/ProcessDictionary.java @@ -4,6 +4,7 @@ import java.nio.file.Paths; import java.util.Comparator; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Collectors; public class ProcessDictionary { @@ -16,7 +17,7 @@ public static void main(String[] args) throws Exception { .limit(10) .forEach(w -> System.out.printf("%s (%d)%n", w, w.length())); - Optional max = Files.lines( +/* Optional max = Files.lines( Paths.get("/", "usr", "share", "dict", "web2")) .filter(s -> s.length() > 10) .map(String::toLowerCase) @@ -25,6 +26,6 @@ public static void main(String[] args) throws Exception { System.out.println(max.isPresent() ? max.get() : max.orElse("None found")); System.out.println(max.orElseGet(() -> "nothing")); - System.out.println(max.orElse("nothing")); + System.out.println(max.orElse("nothing")); */ } } From 61b60820a92793c6e2c98ae8cfc9f207929d3e68 Mon Sep 17 00:00:00 2001 From: Kenneth Kousen Date: Sun, 20 Sep 2015 10:55:06 -0400 Subject: [PATCH 2/5] Update gradle version --- build.gradle | 3 +- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 164 ++++++++++++++++++ gradlew.bat | 90 ++++++++++ src/main/groovy/nfjs/collections/Sorter.java | 7 + src/main/groovy/nfjs/datetime/UseInstant.java | 13 +- .../{UsingOptionals.java => OptionalMap.java} | 6 +- 8 files changed, 280 insertions(+), 9 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat rename src/main/groovy/nfjs/optionals/{UsingOptionals.java => OptionalMap.java} (85%) diff --git a/build.gradle b/build.gradle index 1fff5cd..f4d29ab 100644 --- a/build.gradle +++ b/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'groovy' +apply plugin: 'eclipse' // gradlew cleanEclipse eclipse --> Eclipse project repositories { jcenter() } dependencies { - compile 'org.codehaus.groovy:groovy-all:2.4.1' + compile 'org.codehaus.groovy:groovy-all:2.4.4' testCompile 'org.spockframework:spock-core:1.0-groovy-2.4' } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..fd7e590e5154e82211909581e71018372134fb27 GIT binary patch literal 53636 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⪚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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..45c5518 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Sep 20 10:36:16 EDT 2015 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-2.6-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..91a7e26 --- /dev/null +++ b/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# For Cygwin, ensure paths are in UNIX format before anything is touched. +if $cygwin ; then + [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` +fi + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/groovy/nfjs/collections/Sorter.java b/src/main/groovy/nfjs/collections/Sorter.java index 3ea46d9..03fd078 100644 --- a/src/main/groovy/nfjs/collections/Sorter.java +++ b/src/main/groovy/nfjs/collections/Sorter.java @@ -9,6 +9,13 @@ public class Sorter { public List sortWithComparator() { List sampleStrings = StringSamples.getSampleStrings(); + Collections.sort(sampleStrings, new Comparator() { + @Override + public int compare(String s1, String s2) { + return s2.length() - s1.length(); + } + }); + Collections.sort(sampleStrings, (s1, s2) -> s1.length() - s2.length()); return sampleStrings; diff --git a/src/main/groovy/nfjs/datetime/UseInstant.java b/src/main/groovy/nfjs/datetime/UseInstant.java index b9a26d1..e3c3fc1 100644 --- a/src/main/groovy/nfjs/datetime/UseInstant.java +++ b/src/main/groovy/nfjs/datetime/UseInstant.java @@ -9,7 +9,7 @@ public class UseInstant { public static void main(String[] args) { -/* Instant now = Instant.now(); + Instant now = Instant.now(); System.out.println(now); Instant then = now.plus(1, ChronoUnit.DAYS); @@ -26,14 +26,16 @@ public static void main(String[] args) { .plusMillis(100) .plusNanos(100); System.out.println(then); -*/ + LocalDate date1 = LocalDate.now(); System.out.println(date1); - LocalDate groundHogDay = LocalDate.of(2015, Month.FEBRUARY, 2); + LocalDate groundHogDay = + LocalDate.of(2015, Month.FEBRUARY, 2); System.out.println(groundHogDay); - LocalDate firstDayofSpring = LocalDate.of(2015, 3, 20); + LocalDate firstDayofSpring = + LocalDate.of(2015, 3, 20); // Day of week available System.out.println("First day of spring this year falls on a " + @@ -46,7 +48,7 @@ public static void main(String[] args) { long gap = groundHogDay.until(firstDayofSpring, ChronoUnit.DAYS); System.out.println("There are " + gap + " days between GroundHog Day and 1st day of Spring"); - System.out.println("That's " + (gap/7) + " weeks and " + + System.out.println("That's " + (gap / 7) + " weeks and " + (gap % 7) + " days"); Set availableTimeZones = ZoneId.getAvailableZoneIds(); @@ -69,5 +71,6 @@ public static void main(String[] args) { DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG) .withLocale(Locale.FRANCE); System.out.println(formatter.format(spring)); + } } diff --git a/src/main/groovy/nfjs/optionals/UsingOptionals.java b/src/main/groovy/nfjs/optionals/OptionalMap.java similarity index 85% rename from src/main/groovy/nfjs/optionals/UsingOptionals.java rename to src/main/groovy/nfjs/optionals/OptionalMap.java index d7759f7..a69a3b8 100644 --- a/src/main/groovy/nfjs/optionals/UsingOptionals.java +++ b/src/main/groovy/nfjs/optionals/OptionalMap.java @@ -4,10 +4,10 @@ import java.util.Map; import java.util.Optional; -public class UsingOptionals { +public class OptionalMap { private Map map = new HashMap<>(); - public UsingOptionals() { + public OptionalMap() { map.put("a", 1); map.put("b", 2); map.put("c", 2); @@ -22,7 +22,7 @@ public Optional getValue(String key) { } public static void main(String[] args) { - UsingOptionals uo = new UsingOptionals(); + OptionalMap uo = new OptionalMap(); System.out.println(uo.getMap()); System.out.println(uo.getMap().get("d")); System.out.println(uo.getValue("d")); From b925687e9faf18f9eb86e6f8d7ff197a1a693280 Mon Sep 17 00:00:00 2001 From: Kenneth Kousen Date: Sat, 7 Nov 2015 08:54:08 -0500 Subject: [PATCH 3/5] Update demos for lambdas --- src/main/groovy/nfjs/collections/Sorter.java | 2 +- .../groovy/nfjs/collections/UseTasks.java | 11 ++++++++++ src/main/groovy/nfjs/lambdas/AssignDemo.java | 7 +++--- src/main/groovy/nfjs/lambdas/LambdaDemos.java | 22 +++++++++++++++++++ 4 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 src/main/groovy/nfjs/lambdas/LambdaDemos.java diff --git a/src/main/groovy/nfjs/collections/Sorter.java b/src/main/groovy/nfjs/collections/Sorter.java index 03fd078..a30ad92 100644 --- a/src/main/groovy/nfjs/collections/Sorter.java +++ b/src/main/groovy/nfjs/collections/Sorter.java @@ -63,7 +63,7 @@ public List sortByLengthThenAlpha() { List sampleStrings = StringSamples.getSampleStrings(); Collections.sort(sampleStrings, Comparator.comparingInt(String::length) - .thenComparing(Comparator.naturalOrder())); + .thenComparing(Comparator.naturalOrder())); return sampleStrings; } } diff --git a/src/main/groovy/nfjs/collections/UseTasks.java b/src/main/groovy/nfjs/collections/UseTasks.java index 55f2474..a2d8eef 100644 --- a/src/main/groovy/nfjs/collections/UseTasks.java +++ b/src/main/groovy/nfjs/collections/UseTasks.java @@ -1,6 +1,9 @@ package nfjs.collections; +import jdk.nashorn.internal.runtime.Logging; + import java.util.List; +import java.util.logging.Logger; public class UseTasks { public static void main(String[] args) { @@ -14,5 +17,13 @@ public static void main(String[] args) { System.out.printf( "The average duration is %s%n", averageDuration); + + Logger log = Logging.getLogger("mylogger"); + + for (Task t : tasks) { + log.finest(() -> { + return t.getName(); + }); + } } } diff --git a/src/main/groovy/nfjs/lambdas/AssignDemo.java b/src/main/groovy/nfjs/lambdas/AssignDemo.java index 449c86a..154fdc4 100644 --- a/src/main/groovy/nfjs/lambdas/AssignDemo.java +++ b/src/main/groovy/nfjs/lambdas/AssignDemo.java @@ -18,11 +18,12 @@ public static void main(String[] args) { .filter(x -> x % 3 == 0) .forEach(System.out::println); + /* Predicate mod3 = x -> x % 3 == 0; Arrays.asList(3, 1, 4, 1, 5, 9) - .stream() - .filter(mod3) + .parallelStream() +// .filter(mod3) .forEach(System.out::println); - + */ } } diff --git a/src/main/groovy/nfjs/lambdas/LambdaDemos.java b/src/main/groovy/nfjs/lambdas/LambdaDemos.java new file mode 100644 index 0000000..b69bc1c --- /dev/null +++ b/src/main/groovy/nfjs/lambdas/LambdaDemos.java @@ -0,0 +1,22 @@ +package nfjs.lambdas; + +import java.util.function.Consumer; +import java.util.function.IntConsumer; +import java.util.function.IntUnaryOperator; +import java.util.stream.IntStream; + +public class LambdaDemos { + public static void main(String[] args) { + + IntConsumer printer = System.out::println; + + int offset = 10; + + IntStream.range(1, 10) + .map(x -> (x + offset) * 2) +// .filter(x -> x % 3 == 0) + .forEach(printer); + + // offset = 15; // offset must be effectively final + } +} From 892ba510533fe08426802342902bc1b9dda65572 Mon Sep 17 00:00:00 2001 From: Kenneth Kousen Date: Sun, 15 Nov 2015 08:03:53 -0800 Subject: [PATCH 4/5] Add assignment demo --- src/main/groovy/nfjs/collections/PersonDemo.java | 1 + src/main/groovy/nfjs/lambdas/AssignDemo.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/groovy/nfjs/collections/PersonDemo.java b/src/main/groovy/nfjs/collections/PersonDemo.java index 51bac83..bb90468 100644 --- a/src/main/groovy/nfjs/collections/PersonDemo.java +++ b/src/main/groovy/nfjs/collections/PersonDemo.java @@ -3,6 +3,7 @@ import nfjs.collections.StringSamples; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; public class PersonDemo { diff --git a/src/main/groovy/nfjs/lambdas/AssignDemo.java b/src/main/groovy/nfjs/lambdas/AssignDemo.java index 154fdc4..31e69db 100644 --- a/src/main/groovy/nfjs/lambdas/AssignDemo.java +++ b/src/main/groovy/nfjs/lambdas/AssignDemo.java @@ -18,12 +18,12 @@ public static void main(String[] args) { .filter(x -> x % 3 == 0) .forEach(System.out::println); - /* + Predicate mod3 = x -> x % 3 == 0; Arrays.asList(3, 1, 4, 1, 5, 9) .parallelStream() // .filter(mod3) .forEach(System.out::println); - */ + } } From 72780192ac162fa6971b1ede7be7a4c79f041e1f Mon Sep 17 00:00:00 2001 From: Kenneth Kousen Date: Fri, 20 Nov 2015 12:42:27 -0700 Subject: [PATCH 5/5] Upgrade gradle and add new demos --- gradle/wrapper/gradle-wrapper.jar | Bin 53636 -> 53636 bytes gradle/wrapper/gradle-wrapper.properties | 4 +-- gradlew | 10 ++----- .../groovy/nfjs/collections/ReduceDemo.java | 25 +++++++++++++++++ .../groovy/nfjs/lambdas/RunnableDemo.java | 10 +++++++ .../groovy/nfjs/lambdas/SideEffectDemo.java | 26 ++++++++++++++++++ .../groovy/nfjs/streams/InfiniteStream.java | 2 +- src/test/groovy/nfjs/SorterSpec.groovy | 6 ++-- 8 files changed, 69 insertions(+), 14 deletions(-) create mode 100644 src/main/groovy/nfjs/lambdas/RunnableDemo.java create mode 100644 src/main/groovy/nfjs/lambdas/SideEffectDemo.java diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index fd7e590e5154e82211909581e71018372134fb27..941144813d241db74e1bf25b6804c679fbe7f0a3 100644 GIT binary patch delta 8671 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 +cd "`dirname \"$PRG\"`/" >/dev/null APP_HOME="`pwd -P`" -cd "$SAVED" >&- +cd "$SAVED" >/dev/null CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -114,6 +109,7 @@ fi if $cygwin ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` diff --git a/src/main/groovy/nfjs/collections/ReduceDemo.java b/src/main/groovy/nfjs/collections/ReduceDemo.java index e898fda..8d76388 100644 --- a/src/main/groovy/nfjs/collections/ReduceDemo.java +++ b/src/main/groovy/nfjs/collections/ReduceDemo.java @@ -1,7 +1,10 @@ package nfjs.collections; +import java.awt.*; import java.util.Optional; import java.util.Random; +import java.util.function.Function; +import java.util.stream.Collectors; import java.util.stream.Stream; public class ReduceDemo { @@ -11,6 +14,28 @@ public static void main(String[] args) { .reduce((x, y) -> x + y); System.out.println(total.orElse(0.0)); + String result = StringSamples.getSampleStrings() + .stream() + .map(String::toUpperCase) + .collect(Collectors.joining(" ")); + System.out.println(result); + + Integer totalLength = StringSamples.getSampleStrings() + .stream() + .collect(Collectors.summingInt(String::length)); + System.out.println(totalLength); + + Function f = (s) -> { + System.out.println(Thread.currentThread()); + return s.toUpperCase(); + }; + + Optional val = StringSamples.getSampleStrings() + .parallelStream() + .map(f) + .reduce((x, y) -> x + y); + System.out.println(val.orElse("other")); + total = Stream.generate(Math::random) .limit(1000) .reduce(Double::sum); diff --git a/src/main/groovy/nfjs/lambdas/RunnableDemo.java b/src/main/groovy/nfjs/lambdas/RunnableDemo.java new file mode 100644 index 0000000..ff679a9 --- /dev/null +++ b/src/main/groovy/nfjs/lambdas/RunnableDemo.java @@ -0,0 +1,10 @@ +package nfjs.lambdas; + +public class RunnableDemo { + public static void main(String[] args) { + Runnable r = () -> System.out.println("hello"); + + Thread t = new Thread(r); + t.start(); + } +} diff --git a/src/main/groovy/nfjs/lambdas/SideEffectDemo.java b/src/main/groovy/nfjs/lambdas/SideEffectDemo.java new file mode 100644 index 0000000..b2fbcb3 --- /dev/null +++ b/src/main/groovy/nfjs/lambdas/SideEffectDemo.java @@ -0,0 +1,26 @@ +package nfjs.lambdas; + +import nfjs.collections.StringSamples; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class SideEffectDemo { + public static void main(String[] args) { + List strings = StringSamples.getSampleStrings(); + + // Side effects --> not what we want + List evenLengths = new ArrayList<>(); + strings.stream() + .filter(s -> s.length() % 2 == 0) + .forEach(evenLengths::add); + System.out.println(evenLengths); + + // No side-effects + List evens = strings.stream() + .filter(s -> s.length() % 2 == 0) + .collect(Collectors.toList()); + System.out.println(evens); + } +} diff --git a/src/main/groovy/nfjs/streams/InfiniteStream.java b/src/main/groovy/nfjs/streams/InfiniteStream.java index 0b2b93f..dc44b9a 100644 --- a/src/main/groovy/nfjs/streams/InfiniteStream.java +++ b/src/main/groovy/nfjs/streams/InfiniteStream.java @@ -5,8 +5,8 @@ public class InfiniteStream { public static void main(String[] args) { double sum = Stream.generate(Math::random) - .mapToDouble(Double::doubleValue) .limit(1000) + .mapToDouble(Double::doubleValue) .sum(); System.out.printf("The total is %s%n", sum); } diff --git a/src/test/groovy/nfjs/SorterSpec.groovy b/src/test/groovy/nfjs/SorterSpec.groovy index 8b919b2..9c07d22 100644 --- a/src/test/groovy/nfjs/SorterSpec.groovy +++ b/src/test/groovy/nfjs/SorterSpec.groovy @@ -3,9 +3,6 @@ package nfjs import nfjs.collections.Sorter import spock.lang.Specification -/** - * Created by kousen on 3/5/15. - */ class SorterSpec extends Specification { Sorter sorter = new Sorter() @@ -50,7 +47,8 @@ class SorterSpec extends Specification { then: results.inject { prev, curr -> - + assert prev.size() < curr.size() || prev <= curr + curr } }