diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000000..52586a11a5
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000000..1c2aea2778
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000000..712ab9d985
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/thriftCompiler.xml b/.idea/thriftCompiler.xml
new file mode 100644
index 0000000000..7bc123c6bc
--- /dev/null
+++ b/.idea/thriftCompiler.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000000..35eb1ddfbb
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-numbers/src/main/java/com/ossez/java9/compactstring/CompactStringDemo.java b/core-java-modules/core-java-numbers/src/main/java/com/ossez/java9/compactstring/CompactStringDemo.java
new file mode 100644
index 0000000000..1243ae1b0f
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/java/com/ossez/java9/compactstring/CompactStringDemo.java
@@ -0,0 +1,21 @@
+package com.ossez.java9.compactstring;
+
+import java.util.List;
+import java.util.stream.IntStream;
+
+import static java.util.stream.Collectors.toList;
+
+public class CompactStringDemo {
+
+ public static void main(String[] args) {
+ long startTime = System.currentTimeMillis();
+ List strings = IntStream.rangeClosed(1, 10_000_000).mapToObj(Integer::toString).collect(toList());
+ long totalTime = System.currentTimeMillis() - startTime;
+ System.out.println("Generated " + strings.size() + " strings in " + totalTime + " ms.");
+
+ startTime = System.currentTimeMillis();
+ String appended = (String) strings.stream().limit(100_000).reduce("", (left, right) -> left.toString() + right.toString());
+ totalTime = System.currentTimeMillis() - startTime;
+ System.out.println("Created string of length " + appended.length() + " in " + totalTime + " ms.");
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/App.java b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/App.java
new file mode 100644
index 0000000000..3fe6d8a267
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/App.java
@@ -0,0 +1,21 @@
+package com.ossez.localization;
+
+import java.text.ParseException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Locale;
+
+public class App {
+
+ /**
+ * Runs all available formatter
+ * @throws ParseException
+ */
+ public static void main(String[] args) {
+ List locales = Arrays.asList(new Locale[] { Locale.UK, Locale.ITALY, Locale.FRANCE, Locale.forLanguageTag("pl-PL") });
+ Localization.run(locales);
+ JavaSEFormat.run(locales);
+ ICUFormat.run(locales);
+ }
+
+}
diff --git a/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/ICUFormat.java b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/ICUFormat.java
new file mode 100644
index 0000000000..27de6876ee
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/ICUFormat.java
@@ -0,0 +1,29 @@
+package com.ossez.localization;
+
+import com.ibm.icu.text.MessageFormat;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class ICUFormat {
+
+ public static String getLabel(Locale locale, Object[] data) {
+ ResourceBundle bundle = ResourceBundle.getBundle("formats", locale);
+ String format = bundle.getString("label-icu");
+ MessageFormat formatter = new MessageFormat(format, locale);
+ return formatter.format(data);
+ }
+
+ public static void run(List locales) {
+ System.out.println("ICU formatter");
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 0 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 1 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 2 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Alice", "female", 3 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 0 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 1 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 2 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { "Bob", "male", 3 })));
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/JavaSEFormat.java b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/JavaSEFormat.java
new file mode 100644
index 0000000000..cfffa70323
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/JavaSEFormat.java
@@ -0,0 +1,24 @@
+package com.ossez.localization;
+
+import java.text.MessageFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class JavaSEFormat {
+
+ public static String getLabel(Locale locale, Object[] data) {
+ ResourceBundle bundle = ResourceBundle.getBundle("formats", locale);
+ final String pattern = bundle.getString("label");
+ final MessageFormat formatter = new MessageFormat(pattern, locale);
+ return formatter.format(data);
+ }
+
+ public static void run(List locales) {
+ System.out.println("Java formatter");
+ final Date date = new Date(System.currentTimeMillis());
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { date, "Alice", 0 })));
+ locales.forEach(locale -> System.out.println(getLabel(locale, new Object[] { date, "Alice", 2 })));
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/Localization.java b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/Localization.java
new file mode 100644
index 0000000000..945baf4ee9
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/java/com/ossez/localization/Localization.java
@@ -0,0 +1,18 @@
+package com.ossez.localization;
+
+import java.util.List;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+public class Localization {
+
+ public static String getLabel(Locale locale) {
+ final ResourceBundle bundle = ResourceBundle.getBundle("messages", locale);
+ return bundle.getString("label");
+ }
+
+ public static void run(List locales) {
+ locales.forEach(locale -> System.out.println(getLabel(locale)));
+ }
+
+}
diff --git a/core-java-modules/core-java-numbers/src/main/java/com/ossez/stringperformance/StringPerformance.java b/core-java-modules/core-java-numbers/src/main/java/com/ossez/stringperformance/StringPerformance.java
new file mode 100644
index 0000000000..06c874e3db
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/java/com/ossez/stringperformance/StringPerformance.java
@@ -0,0 +1,198 @@
+package com.ossez.stringperformance;
+
+import com.google.common.base.Splitter;
+import org.apache.commons.lang3.StringUtils;
+import org.openjdk.jmh.annotations.*;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Pattern;
+
+@BenchmarkMode(Mode.SingleShotTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Measurement(batchSize = 100000, iterations = 10)
+@Warmup(batchSize = 100000, iterations = 10)
+@State(Scope.Thread)
+public class StringPerformance {
+
+ protected String baeldung = "baeldung";
+ protected String longString = "Hello baeldung, I am a bit longer than other Strings";
+ protected String formatString = "hello %s, nice to meet you";
+ protected String formatDigit = "%d";
+ protected String emptyString = " ";
+ protected String result = "";
+
+ protected int sampleNumber = 100;
+
+ protected Pattern spacePattern = Pattern.compile(emptyString);
+ protected Pattern longPattern = Pattern.compile(longString);
+ protected List stringSplit = new ArrayList<>();
+ protected List stringTokenizer = new ArrayList<>();
+
+ @Benchmark
+ public String benchmarkStringDynamicConcat() {
+ result += baeldung;
+ return result;
+ }
+
+ @Benchmark
+ public StringBuilder benchmarkStringBuilder() {
+ StringBuilder stringBuilder = new StringBuilder(result);
+ stringBuilder.append(baeldung);
+ return stringBuilder;
+ }
+
+ @Benchmark
+ public StringBuffer benchmarkStringBuffer() {
+ StringBuffer stringBuffer = new StringBuffer(result);
+ stringBuffer.append(baeldung);
+ return stringBuffer;
+ }
+
+ @Benchmark
+ public String benchmarkStringConstructor() {
+ String result = new String("baeldung");
+ return result;
+ }
+
+ @Benchmark
+ public String benchmarkStringLiteral() {
+ String result = "baeldung";
+ return result;
+ }
+
+ @Benchmark
+ public String benchmarkStringFormat_s() {
+ return String.format(formatString, baeldung);
+ }
+
+ @Benchmark
+ public String benchmarkStringConcat() {
+ result = result.concat(baeldung);
+ return result;
+ }
+
+ @Benchmark
+ public String benchmarkStringIntern() {
+ return baeldung.intern();
+ }
+
+ @Benchmark
+ public String benchmarkStringReplace() {
+ return longString.replace("average", " average !!!");
+ }
+
+ @Benchmark
+ public String benchmarkStringUtilsReplace() {
+ return StringUtils.replace(longString, "average", " average !!!");
+ }
+
+ @Benchmark
+ public List benchmarkGuavaSplitter() {
+ return Splitter.on(" ").trimResults()
+ .omitEmptyStrings()
+ .splitToList(longString);
+ }
+
+ @Benchmark
+ public String [] benchmarkStringSplit() {
+ return longString.split(emptyString);
+ }
+
+ @Benchmark
+ public String [] benchmarkStringSplitPattern() {
+ return spacePattern.split(longString, 0);
+ }
+
+ @Benchmark
+ public List benchmarkStringTokenizer() {
+ StringTokenizer st = new StringTokenizer(longString);
+ while (st.hasMoreTokens()) {
+ stringTokenizer.add(st.nextToken());
+ }
+ return stringTokenizer;
+ }
+
+ @Benchmark
+ public List benchmarkStringIndexOf() {
+ int pos = 0, end;
+ while ((end = longString.indexOf(' ', pos)) >= 0) {
+ stringSplit.add(longString.substring(pos, end));
+ pos = end + 1;
+ }
+ //Add last token of string
+ stringSplit.add(longString.substring(pos));
+ return stringSplit;
+ }
+
+ @Benchmark
+ public String benchmarkIntegerToString() {
+ return Integer.toString(sampleNumber);
+ }
+
+ @Benchmark
+ public String benchmarkStringValueOf() {
+ return String.valueOf(sampleNumber);
+ }
+
+
+ @Benchmark
+ public String benchmarkStringConvertPlus() {
+ return sampleNumber + "";
+ }
+
+ @Benchmark
+ public String benchmarkStringFormat_d() {
+ return String.format(formatDigit, sampleNumber);
+ }
+
+ @Benchmark
+ public boolean benchmarkStringEquals() {
+ return longString.equals(baeldung);
+ }
+
+
+ @Benchmark
+ public boolean benchmarkStringEqualsIgnoreCase() {
+ return longString.equalsIgnoreCase(baeldung);
+ }
+
+ @Benchmark
+ public boolean benchmarkStringMatches() {
+ return longString.matches(baeldung);
+ }
+
+ @Benchmark
+ public boolean benchmarkPrecompiledMatches() {
+ return longPattern.matcher(baeldung).matches();
+ }
+
+ @Benchmark
+ public int benchmarkStringCompareTo() {
+ return longString.compareTo(baeldung);
+ }
+
+ @Benchmark
+ public boolean benchmarkStringIsEmpty() {
+ return longString.isEmpty();
+ }
+
+ @Benchmark
+ public boolean benchmarkStringLengthZero() {
+ return longString.length() == 0;
+ }
+
+ public static void main(String[] args) throws Exception {
+ Options options = new OptionsBuilder()
+ .include(StringPerformance.class.getSimpleName()).threads(1)
+ .forks(1).shouldFailOnError(true)
+ .shouldDoGC(true)
+ .jvmArgs("-server").build();
+ new Runner(options).run();
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/main/resources/config.properties b/core-java-modules/core-java-numbers/src/main/resources/config.properties
new file mode 100644
index 0000000000..088ed029d7
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/config.properties
@@ -0,0 +1 @@
+string.too.long= StringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLongStringTooLong
diff --git a/core-java-modules/core-java-numbers/src/main/resources/formats_en.properties b/core-java-modules/core-java-numbers/src/main/resources/formats_en.properties
new file mode 100644
index 0000000000..4bea9a74bb
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/formats_en.properties
@@ -0,0 +1,2 @@
+label=On {0, date, short} {1} has sent you {2, choice, 0#no messages|1#a message|2#two messages|2<{2,number,integer} messages}.
+label-icu={0} has sent you {2, plural, =0 {no messages} =1 {a message} other {{2, number, integer} messages}}.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/formats_fr.properties b/core-java-modules/core-java-numbers/src/main/resources/formats_fr.properties
new file mode 100644
index 0000000000..7f509d494e
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/formats_fr.properties
@@ -0,0 +1,2 @@
+label={0, date, short}, {1}{2, choice, 0# ne|0<} vous a envoy\u00e9 {2, choice, 0#aucun message|1#un message|2#deux messages|2<{2,number,integer} messages}.
+label-icu={0} {2, plural, =0 {ne } other {}}vous a envoy\u00e9 {2, plural, =0 {aucun message} =1 {un message} other {{2, number, integer} messages}}.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/formats_it.properties b/core-java-modules/core-java-numbers/src/main/resources/formats_it.properties
new file mode 100644
index 0000000000..fe061ae1b6
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/formats_it.properties
@@ -0,0 +1,2 @@
+label={0, date, short} {1} ti ha inviato {2, choice, 0#nessun messagio|1#un messaggio|2#due messaggi|2<{2, number, integer} messaggi}.
+label-icu={0} {2, plural, =0 {non } other {}}ti ha inviato {2, plural, =0 {nessun messaggio} =1 {un messaggio} other {{2, number, integer} messaggi}}.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/formats_pl.properties b/core-java-modules/core-java-numbers/src/main/resources/formats_pl.properties
new file mode 100644
index 0000000000..9333ec3396
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/formats_pl.properties
@@ -0,0 +1,2 @@
+label=W {0, date, short} {1}{2, choice, 0# nie|0<} wys\u0142a\u0142a ci {2, choice, 0#\u017Cadnych wiadomo\u015Bci|1#wiadomo\u015B\u0107|2#dwie wiadomo\u015Bci|2<{2, number, integer} wiadomo\u015Bci}.
+label-icu={0} {2, plural, =0 {nie } other {}}{1, select, male {wys\u0142a\u0142} female {wys\u0142a\u0142a} other {wys\u0142a\u0142o}} ci {2, plural, =0 {\u017Cadnej wiadomo\u015Bci} =1 {wiadomo\u015B\u0107} other {{2, number, integer} wiadomo\u015Bci}}.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/messages_en.properties b/core-java-modules/core-java-numbers/src/main/resources/messages_en.properties
new file mode 100644
index 0000000000..bcbca9483c
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/messages_en.properties
@@ -0,0 +1 @@
+label=Alice has sent you a message.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/messages_fr.properties b/core-java-modules/core-java-numbers/src/main/resources/messages_fr.properties
new file mode 100644
index 0000000000..15ad031a30
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/messages_fr.properties
@@ -0,0 +1 @@
+label=Alice vous a envoy\u00e9 un message.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/messages_it.properties b/core-java-modules/core-java-numbers/src/main/resources/messages_it.properties
new file mode 100644
index 0000000000..93b99a9483
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/messages_it.properties
@@ -0,0 +1 @@
+label=Alice ti ha inviato un messaggio.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/messages_pl.properties b/core-java-modules/core-java-numbers/src/main/resources/messages_pl.properties
new file mode 100644
index 0000000000..a64066deea
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/messages_pl.properties
@@ -0,0 +1 @@
+label=Alice wys\u0142a\u0142a ci wiadomo\u015B\u0107.
diff --git a/core-java-modules/core-java-numbers/src/main/resources/stephenking.txt b/core-java-modules/core-java-numbers/src/main/resources/stephenking.txt
new file mode 100644
index 0000000000..f31b4a28bd
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/main/resources/stephenking.txt
@@ -0,0 +1,4 @@
+Get busy living
+or
+get busy dying.
+--Stephen King
\ No newline at end of file
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/LocaleUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/LocaleUnitTest.java
new file mode 100644
index 0000000000..71c17354c2
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/LocaleUnitTest.java
@@ -0,0 +1,20 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import java.math.BigDecimal;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+import static org.junit.Assert.assertEquals;
+
+public class LocaleUnitTest {
+ @Test
+ public void whenUsingLocal_thenCorrectResultsForDifferentLocale() {
+ Locale usLocale = Locale.US;
+ BigDecimal number = new BigDecimal(102_300.456d);
+
+ NumberFormat usNumberFormat = NumberFormat.getCurrencyInstance(usLocale);
+ assertEquals(usNumberFormat.format(number), "$102,300.46");
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringAnagramUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringAnagramUnitTest.java
new file mode 100644
index 0000000000..05c82f69ed
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringAnagramUnitTest.java
@@ -0,0 +1,29 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StringAnagramUnitTest {
+ public boolean isAnagram(String s1, String s2) {
+ if(s1.length() != s2.length())
+ return false;
+
+ char[] arr1 = s1.toCharArray();
+ char[] arr2 = s2.toCharArray();
+
+ Arrays.sort(arr1);
+ Arrays.sort(arr2);
+
+ return Arrays.equals(arr1, arr2);
+ }
+
+ @Test
+ public void whenTestAnagrams_thenTestingCorrectly() {
+ assertThat(isAnagram("car", "arc")).isTrue();
+ assertThat(isAnagram("west", "stew")).isTrue();
+ assertThat(isAnagram("west", "east")).isFalse();
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringChangeCaseUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringChangeCaseUnitTest.java
new file mode 100644
index 0000000000..c283c5027c
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringChangeCaseUnitTest.java
@@ -0,0 +1,20 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringChangeCaseUnitTest {
+ @Test
+ public void givenString_whenChangingToUppercase_thenCaseChanged() {
+ String s = "Welcome to Baeldung!";
+ assertEquals("WELCOME TO BAELDUNG!", s.toUpperCase());
+ }
+
+
+ @Test
+ public void givenString_whenChangingToLowerrcase_thenCaseChanged() {
+ String s = "Welcome to Baeldung!";
+ assertEquals("welcome to baeldung!", s.toLowerCase());
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringCountOccurrencesUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringCountOccurrencesUnitTest.java
new file mode 100644
index 0000000000..99f9913d79
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringCountOccurrencesUnitTest.java
@@ -0,0 +1,28 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringCountOccurrencesUnitTest {
+ public int countOccurrences(String s, char c) {
+ int count = 0;
+ for (int i = 0; i < s.length(); i++) {
+ if (s.charAt(i) == c) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ @Test
+ public void givenString_whenCountingFrequencyOfChar_thenCountCorrect() {
+ assertEquals(3, countOccurrences("united states", 't'));
+ }
+
+ public void givenString_whenUsingJava8_thenCountingOfCharCorrect() {
+ String str = "united states";
+ long count = str.chars().filter(ch -> (char)ch == 't').count();
+ assertEquals(3, count);
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringFormatUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringFormatUnitTest.java
new file mode 100644
index 0000000000..1b481979a9
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringFormatUnitTest.java
@@ -0,0 +1,14 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringFormatUnitTest {
+ @Test
+ public void givenString_whenUsingStringFormat_thenStringFormatted() {
+ String title = "Baeldung";
+ String formatted = String.format("Title is %s", title);
+ assertEquals(formatted, "Title is Baeldung");
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringInternUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringInternUnitTest.java
new file mode 100644
index 0000000000..e11e4a8022
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringInternUnitTest.java
@@ -0,0 +1,17 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StringInternUnitTest {
+ @Test
+ public void whenCallingStringIntern_thenStringsInterned() {
+ String s1 = "Baeldung";
+ String s2 = new String("Baeldung");
+ String s3 = new String("Baeldung").intern();
+
+ assertThat(s1 == s2).isFalse();
+ assertThat(s1 == s3).isTrue();
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringJoinerUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringJoinerUnitTest.java
new file mode 100644
index 0000000000..15c1c381f5
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringJoinerUnitTest.java
@@ -0,0 +1,19 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import java.util.StringJoiner;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringJoinerUnitTest {
+ @Test
+ public void whenUsingStringJoiner_thenStringsJoined() {
+ StringJoiner joiner = new StringJoiner(",", "[", "]");
+ joiner.add("Red")
+ .add("Green")
+ .add("Blue");
+
+ assertEquals(joiner.toString(), "[Red,Green,Blue]");
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringPalindromeUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringPalindromeUnitTest.java
new file mode 100644
index 0000000000..599e3dda22
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringPalindromeUnitTest.java
@@ -0,0 +1,29 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StringPalindromeUnitTest {
+
+ public boolean isPalindrome(String text) {
+ int forward = 0;
+ int backward = text.length() - 1;
+ while (backward > forward) {
+ char forwardChar = text.charAt(forward++);
+ char backwardChar = text.charAt(backward--);
+ if (forwardChar != backwardChar)
+ return false;
+ }
+ return true;
+ }
+
+ @Test
+ public void givenIsPalindromeMethod_whenCheckingString_thenFindIfPalindrome() {
+ assertThat(isPalindrome("madam")).isTrue();
+ assertThat(isPalindrome("radar")).isTrue();
+ assertThat(isPalindrome("level")).isTrue();
+
+ assertThat(isPalindrome("baeldung")).isFalse();
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringReverseUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringReverseUnitTest.java
new file mode 100644
index 0000000000..f91b2071ab
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringReverseUnitTest.java
@@ -0,0 +1,13 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringReverseUnitTest {
+ @Test
+ public void whenUsingInbuildMethods_thenStringReversed() {
+ String reversed = new StringBuilder("baeldung").reverse().toString();
+ assertEquals("gnudleab", reversed);
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringSplitUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringSplitUnitTest.java
new file mode 100644
index 0000000000..24f8eb1a2e
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringSplitUnitTest.java
@@ -0,0 +1,33 @@
+package com.ossez.interview;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import static org.junit.Assert.assertArrayEquals;
+
+public class StringSplitUnitTest {
+ @Test
+ public void givenCoreJava_whenSplittingStrings_thenSplitted() {
+ String expected[] = {
+ "john",
+ "peter",
+ "mary"
+ };
+
+ String[] splitted = "john,peter,mary".split(",");
+ assertArrayEquals( expected, splitted );
+ }
+
+ @Test
+ public void givenApacheCommons_whenSplittingStrings_thenSplitted() {
+ String expected[] = {
+ "john",
+ "peter",
+ "mary"
+ };
+ String[] splitted = StringUtils.split("john peter mary");
+ assertArrayEquals( expected, splitted );
+ }
+
+
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToByteArrayUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToByteArrayUnitTest.java
new file mode 100644
index 0000000000..cf2327668e
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToByteArrayUnitTest.java
@@ -0,0 +1,24 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.Assert.assertArrayEquals;
+
+public class StringToByteArrayUnitTest {
+ @Test
+ public void whenGetBytes_thenCorrect() throws UnsupportedEncodingException {
+ byte[] byteArray1 = "abcd".getBytes();
+ byte[] byteArray2 = "efgh".getBytes(StandardCharsets.US_ASCII);
+ byte[] byteArray3 = "ijkl".getBytes("UTF-8");
+ byte[] expected1 = new byte[] { 97, 98, 99, 100 };
+ byte[] expected2 = new byte[] { 101, 102, 103, 104 };
+ byte[] expected3 = new byte[] { 105, 106, 107, 108 };
+
+ assertArrayEquals(expected1, byteArray1);
+ assertArrayEquals(expected2, byteArray2);
+ assertArrayEquals(expected3, byteArray3);
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToCharArrayUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToCharArrayUnitTest.java
new file mode 100644
index 0000000000..ffb8049331
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToCharArrayUnitTest.java
@@ -0,0 +1,17 @@
+package com.ossez.interview;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.junit.Assert.assertEquals;
+
+public class StringToCharArrayUnitTest {
+ @Test
+ public void whenConvertingStringToCharArray_thenConversionSuccessful() {
+ String beforeConvStr = "hello";
+ char[] afterConvCharArr = { 'h', 'e', 'l', 'l', 'o' };
+
+ assertEquals(Arrays.equals(beforeConvStr.toCharArray(), afterConvCharArr), true);
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToIntegerUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToIntegerUnitTest.java
new file mode 100644
index 0000000000..02a8b6c977
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/interview/StringToIntegerUnitTest.java
@@ -0,0 +1,17 @@
+package com.ossez.interview;
+
+import org.apache.commons.lang3.math.NumberUtils;
+import org.junit.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StringToIntegerUnitTest {
+ @Test
+ public void givenString_whenParsingInt_shouldConvertToInt() {
+ String givenString = "42";
+
+ int result = Integer.parseInt(givenString);
+
+ assertThat(result).isEqualTo(42);
+ }
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/localization/ICUFormatUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/localization/ICUFormatUnitTest.java
new file mode 100644
index 0000000000..a63d7827d9
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/localization/ICUFormatUnitTest.java
@@ -0,0 +1,72 @@
+package com.ossez.localization;
+
+import org.junit.Test;
+
+import java.util.Locale;
+
+import static org.junit.Assert.assertEquals;
+
+public class ICUFormatUnitTest {
+
+ @Test
+ public void givenInUK_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice has sent you no messages.", ICUFormat.getLabel(Locale.UK, new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInUK_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice has sent you a message.", ICUFormat.getLabel(Locale.UK, new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInUK_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob has sent you 6 messages.", ICUFormat.getLabel(Locale.UK, new Object[] { "Bob", "male", 6 }));
+ }
+
+ @Test
+ public void givenInItaly_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice non ti ha inviato nessun messaggio.", ICUFormat.getLabel(Locale.ITALY, new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInItaly_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice ti ha inviato un messaggio.", ICUFormat.getLabel(Locale.ITALY, new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInItaly_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob ti ha inviato 6 messaggi.", ICUFormat.getLabel(Locale.ITALY, new Object[] { "Bob", "male", 6 }));
+ }
+
+ @Test
+ public void givenInFrance_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice ne vous a envoyé aucun message.", ICUFormat.getLabel(Locale.FRANCE, new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInFrance_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice vous a envoyé un message.", ICUFormat.getLabel(Locale.FRANCE, new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInFrance_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob vous a envoyé 6 messages.", ICUFormat.getLabel(Locale.FRANCE, new Object[] { "Bob", "male", 6 }));
+ }
+
+
+ @Test
+ public void givenInPoland_whenAliceSendsNothing_thenCorrectMessage() {
+ assertEquals("Alice nie wysłała ci żadnej wiadomości.", ICUFormat.getLabel(Locale.forLanguageTag("pl-PL"), new Object[] { "Alice", "female", 0 }));
+ }
+
+ @Test
+ public void givenInPoland_whenAliceSendsOneMessage_thenCorrectMessage() {
+ assertEquals("Alice wysłała ci wiadomość.", ICUFormat.getLabel(Locale.forLanguageTag("pl-PL"), new Object[] { "Alice", "female", 1 }));
+ }
+
+ @Test
+ public void givenInPoland_whenBobSendsSixMessages_thenCorrectMessage() {
+ assertEquals("Bob wysłał ci 6 wiadomości.", ICUFormat.getLabel(Locale.forLanguageTag("pl-PL"), new Object[] { "Bob", "male", 6 }));
+ }
+
+}
diff --git a/core-java-modules/core-java-numbers/src/test/java/com/ossez/randomstrings/RandomStringsUnitTest.java b/core-java-modules/core-java-numbers/src/test/java/com/ossez/randomstrings/RandomStringsUnitTest.java
new file mode 100644
index 0000000000..98cdef16d6
--- /dev/null
+++ b/core-java-modules/core-java-numbers/src/test/java/com/ossez/randomstrings/RandomStringsUnitTest.java
@@ -0,0 +1,103 @@
+package com.ossez.randomstrings;
+
+import org.apache.commons.lang3.RandomStringUtils;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.charset.Charset;
+import java.util.Random;
+
+public class RandomStringsUnitTest {
+
+ private static final Logger LOG = LoggerFactory.getLogger(RandomStringsUnitTest.class);
+
+ @Test
+ public void givenUsingPlainJava_whenGeneratingRandomStringUnbounded_thenCorrect() {
+ byte[] array = new byte[7]; // length is bounded by 7
+ new Random().nextBytes(array);
+ String generatedString = new String(array, Charset.forName("UTF-8"));
+
+ LOG.debug(generatedString);
+ }
+
+ @Test
+ public void givenUsingPlainJava_whenGeneratingRandomStringBounded_thenCorrect() {
+ int leftLimit = 97; // letter 'a'
+ int rightLimit = 122; // letter 'z'
+ int targetStringLength = 10;
+ Random random = new Random();
+ StringBuilder buffer = new StringBuilder(targetStringLength);
+
+ for (int i = 0; i < targetStringLength; i++) {
+ int randomLimitedInt = leftLimit + (int) (random.nextFloat() * (rightLimit - leftLimit + 1));
+ buffer.append((char) randomLimitedInt);
+ }
+ String generatedString = buffer.toString();
+
+ LOG.debug(generatedString);
+ }
+
+ @Test
+ public void givenUsingJava8_whenGeneratingRandomAlphabeticString_thenCorrect() {
+ int leftLimit = 97; // letter 'a'
+ int rightLimit = 122; // letter 'z'
+ int targetStringLength = 10;
+ Random random = new Random();
+
+ String generatedString = random.ints(leftLimit, rightLimit + 1)
+ .limit(targetStringLength)
+ .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
+ .toString();
+
+ LOG.debug(generatedString);
+ }
+
+ @Test
+ public void givenUsingJava8_whenGeneratingRandomAlphanumericString_thenCorrect() {
+ int leftLimit = 48; // numeral '0'
+ int rightLimit = 122; // letter 'z'
+ int targetStringLength = 10;
+ Random random = new Random();
+
+ String generatedString = random.ints(leftLimit, rightLimit + 1)
+ .filter(i -> (i <= 57 || i >= 65) && (i <= 90 || i >= 97))
+ .limit(targetStringLength)
+ .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
+ .toString();
+
+ LOG.debug(generatedString);
+ }
+
+ @Test
+ public void givenUsingApache_whenGeneratingRandomString_thenCorrect() {
+ String generatedString = RandomStringUtils.random(10);
+
+ LOG.debug(generatedString);
+ }
+
+ @Test
+ public void givenUsingApache_whenGeneratingRandomAlphabeticString_thenCorrect() {
+ String generatedString = RandomStringUtils.randomAlphabetic(10);
+
+ LOG.debug(generatedString);
+ }
+
+ @Test
+ public void givenUsingApache_whenGeneratingRandomAlphanumericString_thenCorrect() {
+ String generatedString = RandomStringUtils.randomAlphanumeric(10);
+
+ LOG.debug(generatedString);
+ }
+
+ @Test
+ public void givenUsingApache_whenGeneratingRandomStringBounded_thenCorrect() {
+ int length = 10;
+ boolean useLetters = true;
+ boolean useNumbers = false;
+ String generatedString = RandomStringUtils.random(length, useLetters, useNumbers);
+
+ LOG.debug(generatedString);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-2/README.md b/core-java-modules/core-java-streams-2/README.md
new file mode 100644
index 0000000000..2ff95045c3
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/README.md
@@ -0,0 +1,16 @@
+## Core Java streams
+
+This module contains articles about the Stream API in Java.
+
+### Relevant Articles:
+- [The Java 8 Stream API Tutorial](https://www.baeldung.com/java-8-streams)
+- [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction)
+- [Java 8 Stream findFirst() vs. findAny()](https://www.baeldung.com/java-stream-findfirst-vs-findany)
+- [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce)
+- [Java IntStream Conversions](https://www.baeldung.com/java-intstream-convert)
+- [Java 8 Streams peek() API](https://www.baeldung.com/java-streams-peek-api)
+- [Working With Maps Using Streams](https://www.baeldung.com/java-maps-streams)
+- [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection)
+- [How to Add a Single Element to a Stream](https://www.baeldung.com/java-stream-append-prepend)
+- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream)
+- More articles: [[<-- prev>]](/../core-java-streams) [[next -->]](/../core-java-streams-3)
diff --git a/core-java-modules/core-java-streams-2/pom.xml b/core-java-modules/core-java-streams-2/pom.xml
new file mode 100644
index 0000000000..c8fa83c55a
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/pom.xml
@@ -0,0 +1,40 @@
+
+
+ 4.0.0
+ core-java-streams-2
+ 1.0
+ core-java-streams-2
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+
+
+ 1.9
+ 1.9
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/application/Application.java b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/application/Application.java
new file mode 100644
index 0000000000..62d080c32c
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/application/Application.java
@@ -0,0 +1,39 @@
+package com.baeldung.reduce.application;
+
+import com.baeldung.reduce.entities.User;
+import com.baeldung.reduce.utilities.NumberUtils;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+public class Application {
+
+ public static void main(String[] args) {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ int result1 = numbers.stream().reduce(0, (subtotal, element) -> subtotal + element);
+ System.out.println(result1);
+
+ int result2 = numbers.stream().reduce(0, Integer::sum);
+ System.out.println(result2);
+
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result3 = letters.stream().reduce("", (partialString, element) -> partialString + element);
+ System.out.println(result3);
+
+ String result4 = letters.stream().reduce("", String::concat);
+ System.out.println(result4);
+
+ String result5 = letters.stream().reduce("", (partialString, element) -> partialString.toUpperCase() + element.toUpperCase());
+ System.out.println(result5);
+
+ List users = Arrays.asList(new User("John", 30), new User("Julie", 35));
+ int result6 = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ System.out.println(result6);
+
+ String result7 = letters.parallelStream().reduce("", String::concat);
+ System.out.println(result7);
+
+ int result8 = users.parallelStream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ System.out.println(result8);
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/benchmarks/JMHStreamReduceBenchMark.java b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/benchmarks/JMHStreamReduceBenchMark.java
new file mode 100644
index 0000000000..ecb0347e96
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/benchmarks/JMHStreamReduceBenchMark.java
@@ -0,0 +1,52 @@
+package com.baeldung.reduce.benchmarks;
+
+import com.baeldung.reduce.entities.User;
+import java.util.ArrayList;
+import java.util.List;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.RunnerException;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+@State(Scope.Thread)
+@BenchmarkMode(Mode.AverageTime)
+public class JMHStreamReduceBenchMark {
+
+ private final List userList = createUsers();
+
+ public static void main(String[] args) throws RunnerException {
+
+ Options options = new OptionsBuilder()
+ .include(JMHStreamReduceBenchMark.class.getSimpleName()).threads(1)
+ .forks(1).shouldFailOnError(true).shouldDoGC(true)
+ .jvmArgs("-server").build();
+ new Runner(options).run();
+ }
+
+ private List createUsers() {
+ List users = new ArrayList<>();
+ for (int i = 0; i <= 1000000; i++) {
+ users.add(new User("John" + i, i));
+ }
+ return users;
+ }
+
+ @Benchmark
+ public Integer executeReduceOnParallelizedStream() {
+ return this.userList
+ .parallelStream()
+ .reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ }
+
+ @Benchmark
+ public Integer executeReduceOnSequentialStream() {
+ return this.userList
+ .stream()
+ .reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/User.java b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/User.java
new file mode 100644
index 0000000000..6e0a529de6
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/entities/User.java
@@ -0,0 +1,25 @@
+package com.baeldung.reduce.entities;
+
+public class User {
+
+ private final String name;
+ private final int age;
+
+ public User(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "name=" + name + ", age=" + age + '}';
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java
new file mode 100644
index 0000000000..38d5b50120
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/reduce/utilities/NumberUtils.java
@@ -0,0 +1,52 @@
+package com.baeldung.reduce.utilities;
+
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+public abstract class NumberUtils {
+
+ private static final Logger LOGGER = Logger.getLogger(NumberUtils.class.getName());
+
+ public static int divideListElements(List values, Integer divider) {
+ return values.stream()
+ .reduce(0, (a, b) -> {
+ try {
+ return a / divider + b / divider;
+ } catch (ArithmeticException e) {
+ LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero");
+ }
+ return 0;
+ });
+ }
+
+ public static int divideListElementsWithExtractedTryCatchBlock(List values, int divider) {
+ return values.stream().reduce(0, (a, b) -> divide(a, divider) + divide(b, divider));
+ }
+
+ public static int divideListElementsWithApplyFunctionMethod(List values, int divider) {
+ BiFunction division = (a, b) -> a / b;
+ return values.stream().reduce(0, (a, b) -> applyFunction(division, a, divider) + applyFunction(division, b, divider));
+ }
+
+ private static int divide(int value, int factor) {
+ int result = 0;
+ try {
+ result = value / factor;
+ } catch (ArithmeticException e) {
+ LOGGER.log(Level.INFO, "Arithmetic Exception: Division by Zero");
+ }
+ return result;
+ }
+
+ private static int applyFunction(BiFunction function, int a, int b) {
+ try {
+ return function.apply(a, b);
+ }
+ catch(Exception e) {
+ LOGGER.log(Level.INFO, "Exception thrown!");
+ }
+ return 0;
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/streams/MyImmutableListCollector.java b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/streams/MyImmutableListCollector.java
new file mode 100644
index 0000000000..6d515bfb46
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/main/java/com/baeldung/streams/MyImmutableListCollector.java
@@ -0,0 +1,22 @@
+package com.baeldung.streams;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+
+public class MyImmutableListCollector {
+
+ public static > Collector> toImmutableList(Supplier supplier) {
+ return Collector.of(supplier, List::add, (left, right) -> {
+ left.addAll(right);
+ return left;
+ }, Collections::unmodifiableList);
+ }
+
+ public static Collector, List> toImmutableList() {
+ return toImmutableList(ArrayList::new);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-2/src/main/resources/logback.xml b/core-java-modules/core-java-streams-2/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/convert/intstreams/IntStreamsConversionsUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/convert/intstreams/IntStreamsConversionsUnitTest.java
new file mode 100644
index 0000000000..3f2fd1641e
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/convert/intstreams/IntStreamsConversionsUnitTest.java
@@ -0,0 +1,40 @@
+package com.baeldung.convert.intstreams;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class IntStreamsConversionsUnitTest {
+
+ @Test
+ public void intStreamToArray() {
+ int[] first50EvenNumbers = IntStream.iterate(0, i -> i + 2)
+ .limit(50)
+ .toArray();
+
+ assertThat(first50EvenNumbers).hasSize(50);
+ assertThat(first50EvenNumbers[2]).isEqualTo(4);
+ }
+
+ @Test
+ public void intStreamToList() {
+ List first50IntegerNumbers = IntStream.range(0, 50)
+ .boxed()
+ .collect(Collectors.toList());
+
+ assertThat(first50IntegerNumbers).hasSize(50);
+ assertThat(first50IntegerNumbers.get(2)).isEqualTo(2);
+ }
+
+ @Test
+ public void intStreamToString() {
+ String first3numbers = IntStream.of(0, 1, 2)
+ .mapToObj(String::valueOf)
+ .collect(Collectors.joining(", ", "[", "]"));
+
+ assertThat(first3numbers).isEqualTo("[0, 1, 2]");
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/reduce/StreamReduceUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/reduce/StreamReduceUnitTest.java
new file mode 100644
index 0000000000..21eedf953e
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/reduce/StreamReduceUnitTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.reduce;
+
+import com.baeldung.reduce.entities.User;
+import com.baeldung.reduce.utilities.NumberUtils;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class StreamReduceUnitTest {
+
+ @Test
+ public void givenIntegerList_whenReduceWithSumAccumulatorLambda_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ int result = numbers.stream().reduce(0, (subtotal, element) -> subtotal + element);
+ assertThat(result).isEqualTo(21);
+ }
+
+ @Test
+ public void givenIntegerList_whenReduceWithSumAccumulatorMethodReference_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ int result = numbers.stream().reduce(0, Integer::sum);
+ assertThat(result).isEqualTo(21);
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithConcatenatorAccumulatorLambda_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.stream().reduce("", (partialString, element) -> partialString + element);
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithConcatenatorAccumulatorMethodReference_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.stream().reduce("", String::concat);
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithUppercaseConcatenatorAccumulator_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.stream().reduce("", (partialString, element) -> partialString.toUpperCase() + element.toUpperCase());
+ assertThat(result).isEqualTo("ABCDE");
+ }
+
+ @Test
+ public void givenUserList_whenReduceWithAgeAccumulatorAndSumCombiner_thenCorrect() {
+ List users = Arrays.asList(new User("John", 30), new User("Julie", 35));
+ int result = users.stream().reduce(0, (partialAgeResult, user) -> partialAgeResult + user.getAge(), Integer::sum);
+ assertThat(result).isEqualTo(65);
+ }
+
+ @Test
+ public void givenStringList_whenReduceWithParallelStream_thenCorrect() {
+ List letters = Arrays.asList("a", "b", "c", "d", "e");
+ String result = letters.parallelStream().reduce("", String::concat);
+ assertThat(result).isEqualTo("abcde");
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElements_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ assertThat(NumberUtils.divideListElements(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenNumberUtilsClass_whenCalledDivideListElementsWithExtractedTryCatchBlock_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ assertThat(NumberUtils.divideListElementsWithExtractedTryCatchBlock(numbers, 1)).isEqualTo(21);
+ }
+
+ @Test
+ public void givenStream_whneCalleddivideListElementsWithApplyFunctionMethod_thenCorrect() {
+ List numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
+ assertThat(NumberUtils.divideListElementsWithApplyFunctionMethod(numbers, 1)).isEqualTo(21);
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Detail.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Detail.java
new file mode 100644
index 0000000000..d2f5774b24
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Detail.java
@@ -0,0 +1,13 @@
+package com.baeldung.streams;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Detail {
+
+ private static final List PARTS = Arrays.asList("turbine", "pump");
+
+ public List getParts() {
+ return PARTS;
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8FindAnyFindFirstUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8FindAnyFindFirstUnitTest.java
new file mode 100644
index 0000000000..934d7b3542
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8FindAnyFindFirstUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.streams;
+
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static org.hamcrest.Matchers.anyOf;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class Java8FindAnyFindFirstUnitTest {
+
+ @Test
+ public void createStream_whenFindAnyResultIsPresent_thenCorrect() {
+
+ List list = Arrays.asList("A", "B", "C", "D");
+
+ Optional result = list.stream().findAny();
+
+ assertTrue(result.isPresent());
+ assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D")));
+ }
+
+ @Test
+ public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect() throws Exception {
+ List list = Arrays.asList(1, 2, 3, 4, 5);
+ Optional result = list.stream().parallel().filter(num -> num < 4).findAny();
+
+ assertTrue(result.isPresent());
+ assertThat(result.get(), anyOf(is(1), is(2), is(3)));
+ }
+
+ @Test
+ public void createStream_whenFindFirstResultIsPresent_thenCorrect() {
+
+ List list = Arrays.asList("A", "B", "C", "D");
+
+ Optional result = list.stream().findFirst();
+
+ assertTrue(result.isPresent());
+ assertThat(result.get(), is("A"));
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamApiUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamApiUnitTest.java
new file mode 100644
index 0000000000..c4e1f2b3cb
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamApiUnitTest.java
@@ -0,0 +1,242 @@
+package com.baeldung.streams;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+import java.util.regex.Pattern;
+import java.util.stream.*;
+
+import static org.junit.Assert.*;
+
+public class Java8StreamApiUnitTest {
+
+ private long counter;
+
+ private static Logger log = LoggerFactory.getLogger(Java8StreamApiUnitTest.class);
+
+ private List productList;
+
+ @Before
+ public void init() {
+ productList = Arrays.asList(new Product(23, "potatoes"), new Product(14, "orange"), new Product(13, "lemon"), new Product(23, "bread"), new Product(13, "sugar"));
+ }
+
+ @Test
+ public void checkPipeline_whenStreamOneElementShorter_thenCorrect() {
+
+ List list = Arrays.asList("abc1", "abc2", "abc3");
+ long size = list.stream().skip(1).map(element -> element.substring(0, 3)).count();
+ assertEquals(list.size() - 1, size);
+ }
+
+ @Test
+ public void checkOrder_whenChangeQuantityOfMethodCalls_thenCorrect() {
+
+ List list = Arrays.asList("abc1", "abc2", "abc3");
+
+ counter = 0;
+ long sizeFirst = list.stream().skip(2).map(element -> {
+ wasCalled();
+ return element.substring(0, 3);
+ }).count();
+ assertEquals(1, counter);
+
+ counter = 0;
+ long sizeSecond = list.stream().map(element -> {
+ wasCalled();
+ return element.substring(0, 3);
+ }).skip(2).count();
+ assertEquals(3, counter);
+ }
+
+ @Test
+ public void createEmptyStream_whenEmpty_thenCorrect() {
+
+ Stream streamEmpty = Stream.empty();
+ assertEquals(0, streamEmpty.count());
+
+ List names = Collections.emptyList();
+ Stream streamOf = Product.streamOf(names);
+ assertTrue(streamOf.count() == 0);
+ }
+
+ @Test
+ public void createStream_whenCreated_thenCorrect() {
+
+ Collection collection = Arrays.asList("a", "b", "c");
+ Stream streamOfCollection = collection.stream();
+ assertEquals(3, streamOfCollection.count());
+
+ Stream streamOfArray = Stream.of("a", "b", "c");
+ assertEquals(3, streamOfArray.count());
+
+ String[] arr = new String[] { "a", "b", "c" };
+ Stream streamOfArrayPart = Arrays.stream(arr, 1, 3);
+ assertEquals(2, streamOfArrayPart.count());
+
+ IntStream intStream = IntStream.range(1, 3);
+ LongStream longStream = LongStream.rangeClosed(1, 3);
+ Random random = new Random();
+ DoubleStream doubleStream = random.doubles(3);
+ assertEquals(2, intStream.count());
+ assertEquals(3, longStream.count());
+ assertEquals(3, doubleStream.count());
+
+ IntStream streamOfChars = "abc".chars();
+ IntStream str = "".chars();
+ assertEquals(3, streamOfChars.count());
+
+ Stream streamOfString = Pattern.compile(", ").splitAsStream("a, b, c");
+ assertEquals("a", streamOfString.findFirst().get());
+
+ Path path = getPath();
+ Stream streamOfStrings = null;
+ try {
+ streamOfStrings = Files.lines(path, Charset.forName("UTF-8"));
+ } catch (IOException e) {
+ log.error("Error creating streams from paths {}", path, e.getMessage(), e);
+ }
+ assertEquals("a", streamOfStrings.findFirst().get());
+
+ Stream streamBuilder = Stream. builder().add("a").add("b").add("c").build();
+ assertEquals(3, streamBuilder.count());
+
+ Stream streamGenerated = Stream.generate(() -> "element").limit(10);
+ assertEquals(10, streamGenerated.count());
+
+ Stream streamIterated = Stream.iterate(40, n -> n + 2).limit(20);
+ assertTrue(40 <= streamIterated.findAny().get());
+ }
+
+ @Test
+ public void runStreamPipeline_whenOrderIsRight_thenCorrect() {
+
+ List list = Arrays.asList("abc1", "abc2", "abc3");
+ Optional stream = list.stream().filter(element -> {
+ log.info("filter() was called");
+ return element.contains("2");
+ }).map(element -> {
+ log.info("map() was called");
+ return element.toUpperCase();
+ }).findFirst();
+ }
+
+ @Test
+ public void reduce_whenExpected_thenCorrect() {
+
+ OptionalInt reduced = IntStream.range(1, 4).reduce((a, b) -> a + b);
+ assertEquals(6, reduced.getAsInt());
+
+ int reducedTwoParams = IntStream.range(1, 4).reduce(10, (a, b) -> a + b);
+ assertEquals(16, reducedTwoParams);
+
+ int reducedThreeParams = Stream.of(1, 2, 3).reduce(10, (a, b) -> a + b, (a, b) -> {
+ log.info("combiner was called");
+ return a + b;
+ });
+ assertEquals(16, reducedThreeParams);
+
+ int reducedThreeParamsParallel = Arrays.asList(1, 2, 3).parallelStream().reduce(10, (a, b) -> a + b, (a, b) -> {
+ log.info("combiner was called");
+ return a + b;
+ });
+ assertEquals(36, reducedThreeParamsParallel);
+ }
+
+ @Test
+ public void collecting_whenAsExpected_thenCorrect() {
+
+ List collectorCollection = productList.stream().map(Product::getName).collect(Collectors.toList());
+
+ assertTrue(collectorCollection instanceof List);
+ assertEquals(5, collectorCollection.size());
+
+ String listToString = productList.stream().map(Product::getName).collect(Collectors.joining(", ", "[", "]"));
+
+ assertTrue(listToString.contains(",") && listToString.contains("[") && listToString.contains("]"));
+
+ double averagePrice = productList.stream().collect(Collectors.averagingInt(Product::getPrice));
+ assertTrue(17.2 == averagePrice);
+
+ int summingPrice = productList.stream().collect(Collectors.summingInt(Product::getPrice));
+ assertEquals(86, summingPrice);
+
+ IntSummaryStatistics statistics = productList.stream().collect(Collectors.summarizingInt(Product::getPrice));
+ assertEquals(23, statistics.getMax());
+
+ Map> collectorMapOfLists = productList.stream().collect(Collectors.groupingBy(Product::getPrice));
+ assertEquals(3, collectorMapOfLists.keySet().size());
+
+ Map> mapPartioned = productList.stream().collect(Collectors.partitioningBy(element -> element.getPrice() > 15));
+ assertEquals(2, mapPartioned.keySet().size());
+
+ }
+
+ @Test(expected = UnsupportedOperationException.class)
+ public void collect_whenThrows_thenCorrect() {
+ Set unmodifiableSet = productList.stream().collect(Collectors.collectingAndThen(Collectors.toSet(), Collections::unmodifiableSet));
+ unmodifiableSet.add(new Product(4, "tea"));
+ }
+
+ @Test
+ public void customCollector_whenResultContainsAllElementsFrSource_thenCorrect() {
+ Collector> toLinkedList = Collector.of(LinkedList::new, LinkedList::add, (first, second) -> {
+ first.addAll(second);
+ return first;
+ });
+
+ LinkedList linkedListOfPersons = productList.stream().collect(toLinkedList);
+ assertTrue(linkedListOfPersons.containsAll(productList));
+ }
+
+ @Test
+ public void parallelStream_whenWorks_thenCorrect() {
+ Stream streamOfCollection = productList.parallelStream();
+ boolean isParallel = streamOfCollection.isParallel();
+ boolean haveBigPrice = streamOfCollection.map(product -> product.getPrice() * 12).anyMatch(price -> price > 200);
+ assertTrue(isParallel && haveBigPrice);
+ }
+
+ @Test
+ public void parallel_whenIsParallel_thenCorrect() {
+ IntStream intStreamParallel = IntStream.range(1, 150).parallel().map(element -> element * 34);
+ boolean isParallel = intStreamParallel.isParallel();
+ assertTrue(isParallel);
+ }
+
+ @Test
+ public void parallel_whenIsSequential_thenCorrect() {
+ IntStream intStreamParallel = IntStream.range(1, 150).parallel().map(element -> element * 34);
+ IntStream intStreamSequential = intStreamParallel.sequential();
+ boolean isParallel = intStreamParallel.isParallel();
+ assertFalse(isParallel);
+ }
+
+ private Path getPath() {
+ Path path = null;
+ try {
+ path = Files.createTempFile(null, ".txt");
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ }
+
+ try (BufferedWriter writer = Files.newBufferedWriter(path)) {
+ writer.write("a\nb\nc");
+ } catch (IOException e) {
+ log.error(e.getMessage());
+ }
+ return path;
+ }
+
+ private void wasCalled() {
+ counter++;
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java
new file mode 100644
index 0000000000..f46fa79b08
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Java8StreamsUnitTest.java
@@ -0,0 +1,104 @@
+package com.baeldung.streams;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.*;
+
+public class Java8StreamsUnitTest {
+
+ private List list;
+
+ @Before
+ public void init() {
+ list = new ArrayList<>();
+ list.add("One");
+ list.add("OneAndOnly");
+ list.add("Derek");
+ list.add("Change");
+ list.add("factory");
+ list.add("justBefore");
+ list.add("Italy");
+ list.add("Italy");
+ list.add("Thursday");
+ list.add("");
+ list.add("");
+ }
+
+ @Test
+ public void checkStreamCount_whenCreating_givenDifferentSources() {
+ String[] arr = new String[] { "a", "b", "c" };
+ Stream streamArr = Arrays.stream(arr);
+ assertEquals(streamArr.count(), 3);
+
+ Stream streamOf = Stream.of("a", "b", "c");
+ assertEquals(streamOf.count(), 3);
+
+ long count = list.stream().distinct().count();
+ assertEquals(count, 9);
+ }
+
+ @Test
+ public void checkStreamCount_whenOperationFilter_thanCorrect() {
+ Stream streamFilter = list.stream().filter(element -> element.isEmpty());
+ assertEquals(streamFilter.count(), 2);
+ }
+
+ @Test
+ public void checkStreamCount_whenOperationMap_thanCorrect() {
+ List uris = new ArrayList<>();
+ uris.add("C:\\My.txt");
+ Stream streamMap = uris.stream().map(uri -> Paths.get(uri));
+ assertEquals(streamMap.count(), 1);
+
+ List details = new ArrayList<>();
+ details.add(new Detail());
+ details.add(new Detail());
+ Stream streamFlatMap = details.stream().flatMap(detail -> detail.getParts().stream());
+ assertEquals(streamFlatMap.count(), 4);
+ }
+
+ @Test
+ public void checkStreamCount_whenOperationMatch_thenCorrect() {
+ boolean isValid = list.stream().anyMatch(element -> element.contains("h"));
+ boolean isValidOne = list.stream().allMatch(element -> element.contains("h"));
+ boolean isValidTwo = list.stream().noneMatch(element -> element.contains("h"));
+ assertTrue(isValid);
+ assertFalse(isValidOne);
+ assertFalse(isValidTwo);
+ }
+
+ @Test
+ public void checkStreamReducedValue_whenOperationReduce_thenCorrect() {
+ List integers = new ArrayList<>();
+ integers.add(1);
+ integers.add(1);
+ integers.add(1);
+ Integer reduced = integers.stream().reduce(23, (a, b) -> a + b);
+ assertTrue(reduced == 26);
+ }
+
+ @Test
+ public void checkStreamContains_whenOperationCollect_thenCorrect() {
+ List resultList = list.stream().map(element -> element.toUpperCase()).collect(Collectors.toList());
+ assertEquals(resultList.size(), list.size());
+ assertTrue(resultList.contains(""));
+ }
+
+ @Test
+ public void checkParallelStream_whenDoWork() {
+ list.parallelStream().forEach(element -> doWork(element));
+ }
+
+ private void doWork(String string) {
+ assertTrue(true); // just imitate an amount of work
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/PeekUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/PeekUnitTest.java
new file mode 100644
index 0000000000..97af4149d3
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/PeekUnitTest.java
@@ -0,0 +1,118 @@
+package com.baeldung.streams;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.StringWriter;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class PeekUnitTest {
+
+ private StringWriter out;
+
+ @BeforeEach
+ void setup() {
+ out = new StringWriter();
+ }
+
+ @Test
+ void givenStringStream_whenCallingPeekOnly_thenNoElementProcessed() {
+ // given
+ Stream nameStream = Stream.of("Alice", "Bob", "Chuck");
+
+ // when
+ nameStream.peek(out::append);
+
+ // then
+ assertThat(out.toString()).isEmpty();
+ }
+
+ @Test
+ void givenStringStream_whenCallingForEachOnly_thenElementsProcessed() {
+ // given
+ Stream nameStream = Stream.of("Alice", "Bob", "Chuck");
+
+ // when
+ nameStream.forEach(out::append);
+
+ // then
+ assertThat(out.toString()).isEqualTo("AliceBobChuck");
+ }
+
+ @Test
+ void givenStringStream_whenCallingPeekAndNoopForEach_thenElementsProcessed() {
+ // given
+ Stream nameStream = Stream.of("Alice", "Bob", "Chuck");
+
+ // when
+ nameStream.peek(out::append)
+ .forEach(this::noop);
+
+ // then
+ assertThat(out.toString()).isEqualTo("AliceBobChuck");
+ }
+
+ @Test
+ void givenStringStream_whenCallingPeekAndCollect_thenElementsProcessed() {
+ // given
+ Stream nameStream = Stream.of("Alice", "Bob", "Chuck");
+
+ // when
+ nameStream.peek(out::append)
+ .collect(Collectors.toList());
+
+ // then
+ assertThat(out.toString()).isEqualTo("AliceBobChuck");
+ }
+
+ @Test
+ void givenStringStream_whenCallingPeekAndForEach_thenElementsProcessedTwice() {
+ // given
+ Stream nameStream = Stream.of("Alice", "Bob", "Chuck");
+
+ // when
+ nameStream.peek(out::append)
+ .forEach(out::append);
+
+ // then
+ assertThat(out.toString()).isEqualTo("AliceAliceBobBobChuckChuck");
+ }
+
+ @Test
+ void givenStringStream_whenCallingPeek_thenElementsProcessedTwice() {
+ // given
+ Stream userStream = Stream.of(new User("Alice"), new User("Bob"), new User("Chuck"));
+
+ // when
+ userStream.peek(u -> u.setName(u.getName().toLowerCase()))
+ .map(User::getName)
+ .forEach(out::append);
+
+ // then
+ assertThat(out.toString()).isEqualTo("alicebobchuck");
+ }
+
+ private static class User {
+ private String name;
+
+ public User(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ }
+
+ private void noop(String s) {
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Product.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Product.java
new file mode 100644
index 0000000000..7883f055a1
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/Product.java
@@ -0,0 +1,48 @@
+package com.baeldung.streams;
+
+import java.util.List;
+import java.util.stream.Stream;
+
+/**
+ * Created by Alex Vengr
+ */
+public class Product {
+
+ private int price;
+
+ private String name;
+
+ private boolean utilize;
+
+ public Product(int price, String name) {
+ this(price);
+ this.name = name;
+ }
+
+ public Product(int price) {
+ this.price = price;
+ }
+
+ public Product() {
+ }
+
+ public int getPrice() {
+ return price;
+ }
+
+ public void setPrice(int price) {
+ this.price = price;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public static Stream streamOf(List list) {
+ return (list == null || list.isEmpty()) ? Stream.empty() : list.stream();
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamAddUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamAddUnitTest.java
new file mode 100644
index 0000000000..1fada26de5
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamAddUnitTest.java
@@ -0,0 +1,48 @@
+package com.baeldung.streams;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertEquals;
+
+public class StreamAddUnitTest {
+
+ @Test
+ public void givenStream_whenAppendingObject_thenAppended() {
+ Stream anStream = Stream.of("a", "b", "c", "d", "e");
+
+ Stream newStream = Stream.concat(anStream, Stream.of("A"));
+
+ List resultList = newStream.collect(Collectors.toList());
+ assertEquals(resultList.get(resultList.size() - 1), "A");
+ }
+
+ @Test
+ public void givenStream_whenPrependingObject_thenPrepended() {
+ Stream anStream = Stream.of(1, 2, 3, 4, 5);
+
+ Stream newStream = Stream.concat(Stream.of(99), anStream);
+
+ assertEquals(newStream.findFirst()
+ .get(), (Integer) 99);
+ }
+
+ @Test
+ public void givenStream_whenInsertingObject_thenInserted() {
+ Stream anStream = Stream.of(1.1, 2.2, 3.3);
+
+ Stream newStream = insertInStream(anStream, 9.9, 3);
+
+ List resultList = newStream.collect(Collectors.toList());
+ assertEquals(resultList.get(3), (Double) 9.9);
+ }
+
+ private Stream insertInStream(Stream stream, T elem, int index) {
+ List result = stream.collect(Collectors.toList());
+ result.add(index, elem);
+ return result.stream();
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamMapUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamMapUnitTest.java
new file mode 100644
index 0000000000..509a3a3569
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamMapUnitTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.streams;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class StreamMapUnitTest {
+
+ private Map books;
+
+ @Before
+ public void setup() {
+ books = new HashMap<>();
+ books.put("978-0201633610", "Design patterns : elements of reusable object-oriented software");
+ books.put("978-1617291999", "Java 8 in Action: Lambdas, Streams, and functional-style programming");
+ books.put("978-0134685991", "Effective Java");
+ }
+
+
+ @Test
+ public void whenOptionalVersionCalledForExistingTitle_thenReturnOptionalWithISBN() {
+ Optional optionalIsbn = books.entrySet().stream()
+ .filter(e -> "Effective Java".equals(e.getValue()))
+ .map(Map.Entry::getKey).findFirst();
+
+ assertEquals("978-0134685991", optionalIsbn.get());
+ }
+
+ @Test
+ public void whenOptionalVersionCalledForNonExistingTitle_thenReturnEmptyOptionalForISBN() {
+ Optional optionalIsbn = books.entrySet().stream()
+ .filter(e -> "Non Existent Title".equals(e.getValue()))
+ .map(Map.Entry::getKey).findFirst();
+
+ assertEquals(false, optionalIsbn.isPresent());
+ }
+
+ @Test
+ public void whenMultipleResultsVersionCalledForExistingTitle_aCollectionWithMultipleValuesIsReturned() {
+ books.put("978-0321356680", "Effective Java: Second Edition");
+
+ List isbnCodes = books.entrySet().stream()
+ .filter(e -> e.getValue().startsWith("Effective Java"))
+ .map(Map.Entry::getKey)
+ .collect(Collectors.toList());
+
+ assertTrue(isbnCodes.contains("978-0321356680"));
+ assertTrue(isbnCodes.contains("978-0134685991"));
+ }
+
+ @Test
+ public void whenMultipleResultsVersionCalledForNonExistingTitle_aCollectionWithNoValuesIsReturned() {
+ List isbnCodes = books.entrySet().stream()
+ .filter(e -> e.getValue().startsWith("Spring"))
+ .map(Map.Entry::getKey)
+ .collect(Collectors.toList());
+
+ assertTrue(isbnCodes.isEmpty());
+ }
+
+ @Test
+ public void whenKeysFollowingPatternReturnsAllValuesForThoseKeys() {
+ List titlesForKeyPattern = books.entrySet().stream()
+ .filter(e -> e.getKey().startsWith("978-0"))
+ .map(Map.Entry::getValue)
+ .collect(Collectors.toList());
+ assertEquals(2, titlesForKeyPattern.size());
+ assertTrue(titlesForKeyPattern.contains("Design patterns : elements of reusable object-oriented software"));
+ assertTrue(titlesForKeyPattern.contains("Effective Java"));
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamToImmutableUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamToImmutableUnitTest.java
new file mode 100644
index 0000000000..e5339d8327
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/StreamToImmutableUnitTest.java
@@ -0,0 +1,57 @@
+package com.baeldung.streams;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+
+import java.util.*;
+import java.util.stream.IntStream;
+
+import static java.util.stream.Collectors.*;
+
+public class StreamToImmutableUnitTest {
+
+ @Test
+ public void whenUsingCollectingToImmutableSet_thenSuccess() {
+ List givenList = Arrays.asList("a", "b", "c");
+ List result = givenList.stream()
+ .collect(collectingAndThen(toSet(), ImmutableList::copyOf));
+
+ System.out.println(result.getClass());
+ }
+
+ @Test
+ public void whenUsingCollectingToUnmodifiableList_thenSuccess() {
+ List givenList = new ArrayList<>(Arrays.asList("a", "b", "c"));
+ List result = givenList.stream()
+ .collect(collectingAndThen(toList(), Collections::unmodifiableList));
+
+ System.out.println(result.getClass());
+ }
+
+ @Test
+ public void whenCollectToImmutableList_thenSuccess() {
+ List list = IntStream.range(0, 9)
+ .boxed()
+ .collect(ImmutableList.toImmutableList());
+
+ System.out.println(list.getClass());
+ }
+
+ @Test
+ public void whenCollectToMyImmutableListCollector_thenSuccess() {
+ List givenList = Arrays.asList("a", "b", "c", "d");
+ List result = givenList.stream()
+ .collect(MyImmutableListCollector.toImmutableList());
+
+ System.out.println(result.getClass());
+ }
+
+ @Test
+ public void whenPassingSupplier_thenSuccess() {
+ List givenList = Arrays.asList("a", "b", "c", "d");
+ List result = givenList.stream()
+ .collect(MyImmutableListCollector.toImmutableList(LinkedList::new));
+
+ System.out.println(result.getClass());
+ }
+}
diff --git a/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/removeitem/StreamOperateAndRemoveUnitTest.java b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/removeitem/StreamOperateAndRemoveUnitTest.java
new file mode 100644
index 0000000000..194d0bd4d6
--- /dev/null
+++ b/core-java-modules/core-java-streams-2/src/test/java/com/baeldung/streams/removeitem/StreamOperateAndRemoveUnitTest.java
@@ -0,0 +1,80 @@
+package com.baeldung.streams.removeitem;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+public class StreamOperateAndRemoveUnitTest {
+
+ private List- itemList;
+
+ @Before
+ public void setup() {
+
+ itemList = new ArrayList<>();
+ for (int i = 0; i < 10; i++) {
+ itemList.add(new Item(i));
+ }
+ }
+
+ @Test
+ public void givenAListOf10Items_whenFilteredForQualifiedItems_thenFilteredListContains5Items() {
+
+ final List
- filteredList = itemList.stream().filter(item -> item.isQualified())
+ .collect(Collectors.toList());
+
+ Assert.assertEquals(5, filteredList.size());
+ }
+
+ @Test
+ public void givenAListOf10Items_whenOperateAndRemoveQualifiedItemsUsingRemoveIf_thenListContains5Items() {
+
+ final Predicate
- isQualified = item -> item.isQualified();
+ itemList.stream().filter(isQualified).forEach(item -> item.operate());
+ itemList.removeIf(isQualified);
+
+ Assert.assertEquals(5, itemList.size());
+ }
+
+ @Test
+ public void givenAListOf10Items_whenOperateAndRemoveQualifiedItemsUsingRemoveAll_thenListContains5Items() {
+
+ final List
- operatedList = new ArrayList<>();
+ itemList.stream().filter(item -> item.isQualified()).forEach(item -> {
+ item.operate();
+ operatedList.add(item);
+ });
+ itemList.removeAll(operatedList);
+
+ Assert.assertEquals(5, itemList.size());
+ }
+
+ class Item {
+
+ private final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
+
+ private final int value;
+
+ public Item(final int value) {
+
+ this.value = value;
+ }
+
+ public boolean isQualified() {
+
+ return value % 2 == 0;
+ }
+
+ public void operate() {
+
+ logger.info("Even Number: " + this.value);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-3/README.md b/core-java-modules/core-java-streams-3/README.md
new file mode 100644
index 0000000000..48ebf145d2
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/README.md
@@ -0,0 +1,16 @@
+## Core Java streams
+
+This module contains articles about the Stream API in Java.
+
+### Relevant Articles:
+- [The Difference Between map() and flatMap()](https://www.baeldung.com/java-difference-map-and-flatmap)
+- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic)
+- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach)
+- [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams)
+- [Debugging Java 8 Streams with IntelliJ](https://www.baeldung.com/intellij-debugging-java-streams)
+- [Add BigDecimals using the Stream API](https://www.baeldung.com/java-stream-add-bigdecimals)
+- [Should We Close a Java Stream?](https://www.baeldung.com/java-stream-close)
+- [Returning Stream vs. Collection](https://www.baeldung.com/java-return-stream-collection)
+- [Convert a Java Enumeration Into a Stream](https://www.baeldung.com/java-enumeration-to-stream)
+- [When to Use a Parallel Stream in Java](https://www.baeldung.com/java-when-to-use-parallel-stream)
+- More articles: [[<-- prev>]](/../core-java-streams-2)
diff --git a/core-java-modules/core-java-streams-3/pom.xml b/core-java-modules/core-java-streams-3/pom.xml
new file mode 100644
index 0000000000..c2dfdc392b
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/pom.xml
@@ -0,0 +1,73 @@
+
+
+ 4.0.0
+ core-java-streams-3
+ 0.1.0-SNAPSHOT
+ core-java-streams-3
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${jmh-core.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+ test
+
+
+
+
+ core-java-streams-3
+
+
+ src/main/resources
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 1.8
+ 1.8
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${jmh-generator.version}
+
+
+
+
+
+
+
+
+ 1.18.20
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/closure/StreamClosureSnippets.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/closure/StreamClosureSnippets.java
new file mode 100644
index 0000000000..10e5716e31
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/closure/StreamClosureSnippets.java
@@ -0,0 +1,30 @@
+package com.baeldung.streams.closure;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.stream.Stream;
+
+/**
+ * Contains a couple of simple stream API usages.
+ */
+public class StreamClosureSnippets {
+
+ public static void main(String[] args) throws IOException {
+ // Collection based streams shouldn't be closed
+ Arrays.asList("Red", "Blue", "Green")
+ .stream()
+ .filter(c -> c.length() > 4)
+ .map(String::toUpperCase)
+ .forEach(System.out::print);
+
+ String[] colors = {"Red", "Blue", "Green"};
+ Arrays.stream(colors).map(String::toUpperCase).forEach(System.out::println);
+
+ // IO-Based Streams Should be Closed via Try with Resources
+ try (Stream lines = Files.lines(Paths.get("/path/tp/file"))) {
+ // lines will be closed after exiting the try block
+ }
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java
new file mode 100644
index 0000000000..5227fcb6c4
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationSpliterator.java
@@ -0,0 +1,30 @@
+package com.baeldung.streams.conversion;
+
+import java.util.Enumeration;
+import java.util.Spliterators.AbstractSpliterator;
+import java.util.function.Consumer;
+
+public class EnumerationSpliterator extends AbstractSpliterator {
+
+ private final Enumeration enumeration;
+
+ public EnumerationSpliterator(long est, int additionalCharacteristics, Enumeration enumeration) {
+ super(est, additionalCharacteristics);
+ this.enumeration = enumeration;
+ }
+
+ @Override
+ public boolean tryAdvance(Consumer super T> action) {
+ if (enumeration.hasMoreElements()) {
+ action.accept(enumeration.nextElement());
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public void forEachRemaining(Consumer super T> action) {
+ while (enumeration.hasMoreElements())
+ action.accept(enumeration.nextElement());
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java
new file mode 100644
index 0000000000..cf041b9426
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/conversion/EnumerationStreamConversion.java
@@ -0,0 +1,16 @@
+package com.baeldung.streams.conversion;
+
+import java.util.Enumeration;
+import java.util.Spliterator;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+public class EnumerationStreamConversion {
+
+ public static Stream convert(Enumeration enumeration) {
+ EnumerationSpliterator spliterator = new EnumerationSpliterator(Long.MAX_VALUE, Spliterator.ORDERED, enumeration);
+ Stream stream = StreamSupport.stream(spliterator, false);
+
+ return stream;
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/debug/entity/Customer.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/debug/entity/Customer.java
new file mode 100644
index 0000000000..b8e1b6db5b
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/debug/entity/Customer.java
@@ -0,0 +1,19 @@
+package com.baeldung.streams.debug.entity;
+
+public class Customer {
+ private final String name;
+ private final int age;
+
+ public Customer(String name, int age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/forEach/ReverseList.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/forEach/ReverseList.java
new file mode 100644
index 0000000000..c4128d9b72
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/forEach/ReverseList.java
@@ -0,0 +1,84 @@
+package com.baeldung.streams.forEach;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Consumer;
+
+class ReverseList extends ArrayList {
+
+ List list = Arrays.asList("A", "B", "C", "D");
+
+ Consumer removeElement = s -> {
+ System.out.println(s + " " + list.size());
+ if (s != null && s.equals("A")) {
+ list.remove("D");
+ }
+ };
+
+ @Override
+ public Iterator iterator() {
+
+ final int startIndex = this.size() - 1;
+ final List list = this;
+ return new Iterator() {
+
+ int currentIndex = startIndex;
+
+ @Override
+ public boolean hasNext() {
+ return currentIndex >= 0;
+ }
+
+ @Override
+ public String next() {
+ String next = list.get(currentIndex);
+ currentIndex--;
+ return next;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+ }
+
+ public void forEach(Consumer super String> action) {
+ for (String s : this) {
+ action.accept(s);
+ }
+ }
+
+ public void iterateParallel() {
+ list.forEach(System.out::print);
+ System.out.print(" ");
+ list.parallelStream().forEach(System.out::print);
+ }
+
+ public void iterateReverse() {
+ List myList = new ReverseList();
+ myList.addAll(list);
+ myList.forEach(System.out::print);
+ System.out.print(" ");
+ myList.stream().forEach(System.out::print);
+ }
+
+ public void removeInCollectionForEach() {
+ list.forEach(removeElement);
+ }
+
+ public void removeInStreamForEach() {
+ list.stream().forEach(removeElement);
+ }
+
+ public static void main(String[] argv) {
+
+ ReverseList collectionForEach = new ReverseList();
+ collectionForEach.iterateParallel();
+ collectionForEach.iterateReverse();
+ collectionForEach.removeInCollectionForEach();
+ collectionForEach.removeInStreamForEach();
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java
new file mode 100644
index 0000000000..461d728ad0
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/BenchmarkRunner.java
@@ -0,0 +1,9 @@
+package com.baeldung.streams.parallel;
+
+public class BenchmarkRunner {
+
+ public static void main(String[] args) throws Exception {
+ org.openjdk.jmh.Main.main(args);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java
new file mode 100644
index 0000000000..9ad569df30
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/DifferentSourceSplitting.java
@@ -0,0 +1,54 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.ArrayList;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+public class DifferentSourceSplitting {
+
+ private static final List arrayListOfNumbers = new ArrayList<>();
+ private static final List linkedListOfNumbers = new LinkedList<>();
+
+ static {
+ IntStream.rangeClosed(1, 1_000_000).forEach(i -> {
+ arrayListOfNumbers.add(i);
+ linkedListOfNumbers.add(i);
+ });
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceArrayListSequential() {
+ arrayListOfNumbers.stream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceArrayListParallel() {
+ arrayListOfNumbers.parallelStream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceLinkedListSequential() {
+ linkedListOfNumbers.stream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void differentSourceLinkedListParallel() {
+ linkedListOfNumbers.parallelStream().reduce(0, Integer::sum);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java
new file mode 100644
index 0000000000..bc5cbf491b
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MemoryLocalityCosts.java
@@ -0,0 +1,52 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+public class MemoryLocalityCosts {
+
+ private static final int[] intArray = new int[1_000_000];
+ private static final Integer[] integerArray = new Integer[1_000_000];
+
+ static {
+ IntStream.rangeClosed(1, 1_000_000).forEach(i -> {
+ intArray[i-1] = i;
+ integerArray[i-1] = i;
+ });
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntArraySequential() {
+ Arrays.stream(intArray).reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntArrayParallel() {
+ Arrays.stream(intArray).parallel().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntegerArraySequential() {
+ Arrays.stream(integerArray).reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void localityIntegerArrayParallel() {
+ Arrays.stream(integerArray).parallel().reduce(0, Integer::sum);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java
new file mode 100644
index 0000000000..a9919dbe72
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/MergingCosts.java
@@ -0,0 +1,52 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+public class MergingCosts {
+
+ private static final List arrayListOfNumbers = new ArrayList<>();
+
+ static {
+ IntStream.rangeClosed(1, 1_000_000).forEach(i -> {
+ arrayListOfNumbers.add(i);
+ });
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsSumSequential() {
+ arrayListOfNumbers.stream().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsSumParallel() {
+ arrayListOfNumbers.stream().parallel().reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsGroupingSequential() {
+ arrayListOfNumbers.stream().collect(Collectors.toSet());
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void mergingCostsGroupingParallel() {
+ arrayListOfNumbers.stream().parallel().collect(Collectors.toSet());
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java
new file mode 100644
index 0000000000..f236f418e8
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/ParallelStream.java
@@ -0,0 +1,15 @@
+package com.baeldung.streams.parallel;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class ParallelStream {
+
+ public static void main(String[] args) {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ listOfNumbers.parallelStream().forEach(number ->
+ System.out.println(number + " " + Thread.currentThread().getName())
+ );
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java
new file mode 100644
index 0000000000..01379130fa
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SequentialStream.java
@@ -0,0 +1,15 @@
+package com.baeldung.streams.parallel;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class SequentialStream {
+
+ public static void main(String[] args) {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ listOfNumbers.stream().forEach(number ->
+ System.out.println(number + " " + Thread.currentThread().getName())
+ );
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java
new file mode 100644
index 0000000000..d1e878df1f
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/parallel/SplittingCosts.java
@@ -0,0 +1,27 @@
+package com.baeldung.streams.parallel;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+
+import java.util.concurrent.TimeUnit;
+import java.util.stream.IntStream;
+
+public class SplittingCosts {
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void sourceSplittingIntStreamSequential() {
+ IntStream.rangeClosed(1, 100).reduce(0, Integer::sum);
+ }
+
+ @Benchmark
+ @BenchmarkMode(Mode.AverageTime)
+ @OutputTimeUnit(TimeUnit.NANOSECONDS)
+ public static void sourceSplittingIntStreamParallel() {
+ IntStream.rangeClosed(1, 100).parallel().reduce(0, Integer::sum);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/primitivestreams/PrimitiveStreams.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/primitivestreams/PrimitiveStreams.java
new file mode 100644
index 0000000000..fb2001f10f
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/primitivestreams/PrimitiveStreams.java
@@ -0,0 +1,23 @@
+package com.baeldung.streams.primitivestreams;
+
+import java.util.Arrays;
+import java.util.stream.IntStream;
+
+class PrimitiveStreams {
+
+ int min(int[] integers) {
+ return Arrays.stream(integers).min().getAsInt();
+ }
+
+ int max(int... integers) {
+ return IntStream.of(integers).max().getAsInt();
+ }
+
+ int sum(int... integers) {
+ return IntStream.of(integers).sum();
+ }
+
+ double avg(int... integers) {
+ return IntStream.of(integers).average().getAsDouble();
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/streamvscollection/StreamVsCollectionExample.java b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/streamvscollection/StreamVsCollectionExample.java
new file mode 100644
index 0000000000..379d231bed
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/java/com/baeldung/streams/streamvscollection/StreamVsCollectionExample.java
@@ -0,0 +1,95 @@
+package com.baeldung.streams.streamvscollection;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class StreamVsCollectionExample {
+
+ static ArrayList userNameSource = new ArrayList<>();
+
+ static {
+ userNameSource.add("john");
+ userNameSource.add("smith");
+ userNameSource.add("tom");
+ userNameSource.add("rob");
+ userNameSource.add("charlie");
+ userNameSource.add("alfred");
+ }
+
+ public static Stream userNames() {
+ return userNameSource.stream();
+ }
+
+ public static List userNameList() {
+ return userNames().collect(Collectors.toList());
+ }
+
+ public static Set userNameSet() {
+ return userNames().collect(Collectors.toSet());
+ }
+
+ public static Map userNameMap() {
+ return userNames().collect(Collectors.toMap(u1 -> u1.toString(), u1 -> u1.toString()));
+ }
+
+ public static Stream filterUserNames() {
+ return userNames().filter(i -> i.length() >= 4);
+ }
+
+ public static Stream sortUserNames() {
+ return userNames().sorted();
+ }
+
+ public static Stream limitUserNames() {
+ return userNames().limit(3);
+ }
+
+ public static Stream sortFilterLimitUserNames() {
+ return filterUserNames().sorted().limit(3);
+ }
+
+ public static void printStream(Stream stream) {
+ stream.forEach(System.out::println);
+ }
+
+ public static void modifyList() {
+ userNameSource.remove(2);
+ }
+
+ public static Map modifyMap() {
+ Map userNameMap = userNameMap();
+ userNameMap.put("bob", "bob");
+ userNameMap.remove("alfred");
+
+ return userNameMap;
+ }
+
+ public static void tryStreamTraversal() {
+ Stream userNameStream = userNames();
+ userNameStream.forEach(System.out::println);
+
+ try {
+ userNameStream.forEach(System.out::println);
+ } catch(IllegalStateException e) {
+ System.out.println("stream has already been operated upon or closed");
+ }
+ }
+
+ public static void main(String[] args) {
+ System.out.println(userNameMap());
+ System.out.println(modifyMap());
+ tryStreamTraversal();
+
+ Set set = userNames().collect(Collectors.toCollection(TreeSet::new));
+ set.forEach(val -> System.out.println(val));
+
+ }
+
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/main/resources/logback.xml b/core-java-modules/core-java-streams-3/src/main/resources/logback.xml
new file mode 100644
index 0000000000..7d900d8ea8
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/main/resources/logback.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java
new file mode 100644
index 0000000000..9399908b30
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/bigdecimals/AddNumbersUnitTest.java
@@ -0,0 +1,42 @@
+package com.baeldung.streams.bigdecimals;
+
+import static org.junit.Assert.assertEquals;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import org.junit.Test;
+
+public class AddNumbersUnitTest {
+
+ @Test
+ public void givenIntStream_whenSum_thenResultIsCorrect() {
+ IntStream intNumbers = IntStream.range(0, 3);
+ assertEquals(3, intNumbers.sum());
+ }
+
+ @Test
+ public void givenCollectionOfDouble_whenUsingMapToDoubleToSum_thenResultIsCorrect() {
+ List doubleNumbers = Arrays.asList(23.48, 52.26, 13.5);
+ double result = doubleNumbers.stream()
+ .mapToDouble(Double::doubleValue)
+ .sum();
+ assertEquals(89.24, result, .1);
+ }
+
+ public void givenStreamOfIntegers_whenUsingReduceToSum_thenResultIsCorrect() {
+ Stream intNumbers = Stream.of(0, 1, 2);
+ int result = intNumbers.reduce(0, Integer::sum);
+ assertEquals(106, result);
+ }
+
+ public void givenStreamOfBigDecimals_whenUsingReduceToSum_thenResultIsCorrect() {
+ Stream bigDecimalNumber = Stream.of(BigDecimal.ZERO, BigDecimal.ONE, BigDecimal.TEN);
+ BigDecimal result = bigDecimalNumber.reduce(BigDecimal.ZERO, BigDecimal::add);
+ assertEquals(11, result);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conditional/StreamForEachIfElseUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conditional/StreamForEachIfElseUnitTest.java
new file mode 100644
index 0000000000..a49a092864
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conditional/StreamForEachIfElseUnitTest.java
@@ -0,0 +1,41 @@
+package com.baeldung.streams.conditional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StreamForEachIfElseUnitTest {
+
+ @Test
+ public final void givenIntegerStream_whenCheckingIntegerParityWithIfElse_thenEnsureCorrectParity() {
+ List ints = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+
+ ints.stream()
+ .forEach(i -> {
+ if (i.intValue() % 2 == 0) {
+ Assert.assertTrue(i.intValue() + " is not even", i.intValue() % 2 == 0);
+ } else {
+ Assert.assertTrue(i.intValue() + " is not odd", i.intValue() % 2 != 0);
+ }
+ });
+
+ }
+
+ @Test
+ public final void givenIntegerStream_whenCheckingIntegerParityWithStreamFilter_thenEnsureCorrectParity() {
+ List ints = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
+
+ Stream evenIntegers = ints.stream()
+ .filter(i -> i.intValue() % 2 == 0);
+ Stream oddIntegers = ints.stream()
+ .filter(i -> i.intValue() % 2 != 0);
+
+ evenIntegers.forEach(i -> Assert.assertTrue(i.intValue() + " is not even", i.intValue() % 2 == 0));
+ oddIntegers.forEach(i -> Assert.assertTrue(i.intValue() + " is not odd", i.intValue() % 2 != 0));
+
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java
new file mode 100644
index 0000000000..a075312fb5
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/conversion/EnumerationStreamConversionUnitTest.java
@@ -0,0 +1,35 @@
+package com.baeldung.streams.conversion;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+
+public class EnumerationStreamConversionUnitTest {
+
+ @Test
+ public void givenEnumeration_whenConvertedToStream_thenNotNull() {
+ Vector input = new Vector<>(Arrays.asList(1, 2, 3, 4, 5));
+
+ Stream resultingStream = EnumerationStreamConversion.convert(input.elements());
+
+ Assert.assertNotNull(resultingStream);
+ }
+
+ @Test
+ public void whenConvertedToList_thenCorrect() {
+ Vector input = new Vector<>(Arrays.asList(1, 2, 3, 4, 5));
+
+ Stream stream = EnumerationStreamConversion.convert(input.elements());
+ List list = stream.filter(e -> e >= 3)
+ .collect(Collectors.toList());
+ assertThat(list, contains(3, 4, 5));
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/debug/Example1.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/debug/Example1.java
new file mode 100644
index 0000000000..d8087bc98a
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/debug/Example1.java
@@ -0,0 +1,18 @@
+package com.baeldung.streams.debug;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.stream.IntStream;
+
+import org.junit.Test;
+
+public class Example1 {
+ @Test
+ public void whenDebugging_thenInformationIsShown() {
+ int[] listOutputSorted = IntStream.of(-3, 10, -4, 1, 3)
+ .sorted()
+ .toArray();
+
+ assertThat(listOutputSorted).isSorted();
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/debug/Example2.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/debug/Example2.java
new file mode 100644
index 0000000000..56cbddf0b4
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/debug/Example2.java
@@ -0,0 +1,36 @@
+package com.baeldung.streams.debug;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import org.junit.Test;
+
+import com.baeldung.streams.debug.entity.Customer;
+
+public class Example2 {
+ @Test
+ public void whenDebugging_thenInformationIsShown() {
+ List> customers = Arrays.asList(
+ Optional.of(new Customer("John P.", 15)),
+ Optional.of(new Customer("Sarah M.", 78)),
+ Optional.empty(),
+ Optional.of(new Customer("Mary T.", 20)),
+ Optional.empty(),
+ Optional.of(new Customer("Florian G.", 89)),
+ Optional.empty()
+ );
+
+ long numberOf65PlusCustomers = customers.stream()
+ .flatMap(c -> c.map(Stream::of)
+ .orElseGet(Stream::empty))
+ .mapToInt(Customer::getAge)
+ .filter(c -> c > 65)
+ .count();
+
+ assertThat(numberOf65PlusCustomers).isEqualTo(2);
+ }
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java
new file mode 100644
index 0000000000..f9aab8ed6c
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/parallel/ForkJoinUnitTest.java
@@ -0,0 +1,46 @@
+package com.baeldung.streams.parallel;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ForkJoinPool;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ForkJoinUnitTest {
+
+ @Test
+ void givenSequentialStreamOfNumbers_whenReducingSumWithIdentityFive_thenResultIsCorrect() {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ int sum = listOfNumbers.stream().reduce(5, Integer::sum);
+ assertThat(sum).isEqualTo(15);
+ }
+
+ @Test
+ void givenParallelStreamOfNumbers_whenReducingSumWithIdentityFive_thenResultIsNotCorrect() {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ int sum = listOfNumbers.parallelStream().reduce(5, Integer::sum);
+ assertThat(sum).isNotEqualTo(15);
+ }
+
+ @Test
+ void givenParallelStreamOfNumbers_whenReducingSumWithIdentityZero_thenResultIsCorrect() {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ int sum = listOfNumbers.parallelStream().reduce(0, Integer::sum) + 5;
+ assertThat(sum).isEqualTo(15);
+ }
+
+ @Test
+ public void givenParallelStreamOfNumbers_whenUsingCustomThreadPool_thenResultIsCorrect()
+ throws InterruptedException, ExecutionException {
+ List listOfNumbers = Arrays.asList(1, 2, 3, 4);
+ ForkJoinPool customThreadPool = new ForkJoinPool(4);
+ int sum = customThreadPool.submit(
+ () -> listOfNumbers.parallelStream().reduce(0, Integer::sum)).get();
+ customThreadPool.shutdown();
+ assertThat(sum).isEqualTo(10);
+ }
+
+}
diff --git a/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/primitivestreams/PrimitiveStreamsUnitTest.java b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/primitivestreams/PrimitiveStreamsUnitTest.java
new file mode 100644
index 0000000000..18966425e4
--- /dev/null
+++ b/core-java-modules/core-java-streams-3/src/test/java/com/baeldung/streams/primitivestreams/PrimitiveStreamsUnitTest.java
@@ -0,0 +1,93 @@
+package com.baeldung.streams.primitivestreams;
+
+import org.junit.Test;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class PrimitiveStreamsUnitTest {
+
+ private PrimitiveStreams streams = new PrimitiveStreams();
+
+ @Test
+ public void givenAnArrayOfIntegersWhenMinIsCalledThenCorrectMinIsReturned() {
+ int[] integers = new int[] { 20, 98, 12, 7, 35 };
+ int min = streams.min(integers); // returns 7
+
+ assertEquals(7, min);
+ }
+
+ @Test
+ public void givenAnArrayOfIntegersWhenMaxIsCalledThenCorrectMaxIsReturned() {
+ int max = streams.max(20, 98, 12, 7, 35);
+
+ assertEquals(98, max);
+ }
+
+ @Test
+ public void givenAnArrayOfIntegersWhenSumIsCalledThenCorrectSumIsReturned() {
+ int sum = streams.sum(20, 98, 12, 7, 35);
+
+ assertEquals(172, sum);
+ }
+
+ @Test
+ public void givenAnArrayOfIntegersWhenAvgIsCalledThenCorrectAvgIsReturned() {
+ double avg = streams.avg(20, 98, 12, 7, 35);
+
+ assertTrue(34.4 == avg);
+ }
+
+ @Test
+ public void givenARangeOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() {
+ int sum = IntStream.range(1, 10).sum();
+
+ assertEquals(45, sum);
+ }
+
+ @Test
+ public void givenARangeClosedOfIntegersWhenIntStreamSumIsCalledThenCorrectSumIsReturned() {
+ int sum = IntStream.rangeClosed(1, 10).sum();
+
+ assertEquals(55, sum);
+ }
+
+ @Test
+ public void givenARangeWhenForEachIsCalledThenTheIndicesWillBePrinted() {
+ IntStream.rangeClosed(1, 5).parallel().forEach(System.out::println);
+ }
+
+ @Test
+ public void givenAnArrayWhenSumIsCalledThenTheCorrectSumIsReturned() {
+
+ int sum = Stream.of(33, 45).mapToInt(i -> i).sum();
+
+ assertEquals(78, sum);
+ }
+
+ @Test
+ public void givenAnIntStreamThenGetTheEvenIntegers() {
+ List evenInts = IntStream.rangeClosed(1, 10).filter(i -> i % 2 == 0).boxed().collect(Collectors.toList());
+
+ List expected = IntStream.of(2, 4, 6, 8, 10).boxed().collect(Collectors.toList());
+
+ assertEquals(expected, evenInts);
+ }
+
+ class Person {
+ private int age;
+
+ Person(int age) {
+ this.age = age;
+ }
+
+ int getAge() {
+ return age;
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-4/README.md b/core-java-modules/core-java-streams-4/README.md
new file mode 100644
index 0000000000..6eeee943aa
--- /dev/null
+++ b/core-java-modules/core-java-streams-4/README.md
@@ -0,0 +1,3 @@
+## Relevant Articles:
+
+- [Count Occurrences Using Java groupingBy Collector](https://www.baeldung.com/java-groupingby-count)
diff --git a/core-java-modules/core-java-streams-4/pom.xml b/core-java-modules/core-java-streams-4/pom.xml
new file mode 100644
index 0000000000..110ec50b8c
--- /dev/null
+++ b/core-java-modules/core-java-streams-4/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+ core-java-streams-4
+ 0.1.0-SNAPSHOT
+ core-java-streams-4
+ jar
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
+
+ log4j
+ log4j
+ ${log4j.version}
+
+
+ org.junit
+ junit-bom
+ ${junit-jupiter.version}
+ pom
+ import
+
+
+
+
+ core-java-streams-4
+
+
+ src/main
+ true
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ ${maven-compiler-plugin.version}
+
+ ${maven.compiler.source}
+ ${maven.compiler.target}
+ -parameters
+
+
+
+
+
+
+
+ 3.1
+ 1.8
+ 1.8
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streamcollectors/StreamGroupingByCollectorUnitTest.java b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streamcollectors/StreamGroupingByCollectorUnitTest.java
new file mode 100644
index 0000000000..c50d73a638
--- /dev/null
+++ b/core-java-modules/core-java-streams-4/src/test/java/com/baeldung/streamcollectors/StreamGroupingByCollectorUnitTest.java
@@ -0,0 +1,84 @@
+package com.baeldung.streamcollectors;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class StreamGroupingByCollectorUnitTest {
+ @Test
+ public void givenListOfStrings_whenGroupingEqualStrings_thenUseCollectorsGroupingByToGroupEqualStringsAndCountOfOccurrences() {
+
+ List list = new ArrayList<>(Arrays.asList("Foo", "Bar", "Bar", "Foo", "Bar"));
+
+ Map result = list.stream().collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
+ Assert.assertEquals(new Long(2), result.get("Foo"));
+ Assert.assertEquals(new Long(3), result.get("Bar"));
+
+ }
+
+ @Test
+ public void givenListOfStrings_whenGroupingEqualLengthStrings_thenUseCollectorsGroupingByConcurrentToGroupEqualLengthStringsAndCountOfOccurrences() {
+
+ List list = new ArrayList<>(Arrays.asList("Adam", "Bill", "Jack", "Joe", "Ian"));
+
+ Map result = list.stream().collect(Collectors.groupingByConcurrent(String::length, Collectors.counting()));
+ Assert.assertEquals(new Long(2), result.get(3));
+ Assert.assertEquals(new Long(3), result.get(4));
+
+ }
+
+ @Test
+ public void givenListOfEmployees_whenGroupingDepartmentId_thenUseCollectorsGroupingByDepartmentIdAndCountNumberOfEmployeesWithinEveryDepartment() {
+
+ List list = new ArrayList<>(Arrays.asList(new Employee(1, "Joe", 1), new Employee(2, "Josh", 1), new Employee(3, "Jamie", 2), new Employee(4, "Jim", 2), new Employee(5, "Jack", 2)));
+
+ Map result = list.stream().collect(Collectors.groupingBy(Employee::getDepartmentId, Collectors.counting()));
+ Assert.assertEquals(new Long(2), result.get(1));
+ Assert.assertEquals(new Long(3), result.get(2));
+
+ }
+
+ static class Employee {
+
+ Integer employeeId;
+ String employeeName;
+ Integer departmentId;
+
+ Employee(Integer employeeId, String employeeName, Integer departmentId) {
+ this.employeeId = employeeId;
+ this.employeeName = employeeName;
+ this.departmentId = departmentId;
+ }
+
+ public Integer getEmployeeId() {
+ return employeeId;
+ }
+
+ public void setEmployeeId(Integer employeeId) {
+ this.employeeId = employeeId;
+ }
+
+ public String getEmployeeName() {
+ return employeeName;
+ }
+
+ public void setEmployeeName(String employeeName) {
+ this.employeeName = employeeName;
+ }
+
+ public Integer getDepartmentId() {
+ return departmentId;
+ }
+
+ public void setDepartmentId(Integer departmentId) {
+ this.departmentId = departmentId;
+ }
+ }
+
+}