Skip to content
Snippets Groups Projects
Commit d96215b0 authored by Stuart Marks's avatar Stuart Marks
Browse files

Pre-compile regex pattern and use splitAsStream.

parent 2865d8ce
No related branches found
No related tags found
No related merge requests found
......@@ -9,6 +9,7 @@ import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.LongAdder;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -51,8 +52,10 @@ public class E_IntermediateStreams {
/**
* Collect all the words from the text file into a list.
* Use String.split(REGEXP) to split a string into words.
* REGEXP is defined at the bottom of this file.
* Use the regular expression pattern WORD_PATTERN to split
* a string into words, and use Pattern.splitAsStream(String)
* to do the splitting. WORD_PATTERN is defined at the bottom
* of this file.
*
* @throws IOException
*/
......@@ -194,7 +197,8 @@ public class E_IntermediateStreams {
// ========================================================
static final String REGEXP = "[- .:,]+"; // for splitting into words
// Pattern for splitting a string into words
static final Pattern WORD_PATTERN = Pattern.compile("[- .:,]+");
private BufferedReader reader;
......
......@@ -17,6 +17,7 @@ import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
......@@ -241,7 +242,8 @@ public class F_AdvancedStreams {
// ========================================================
static final String REGEXP = "[- .:,]+"; // for splitting into words
// Pattern for splitting a string into words
static final Pattern WORD_PATTERN = Pattern.compile("[- .:,]+");
private BufferedReader reader;
......
......@@ -9,6 +9,7 @@ import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.LongAdder;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -57,8 +58,10 @@ public class E_IntermediateStreams {
/**
* Collect all the words from the text file into a list.
* Use String.split(REGEXP) to split a string into words.
* REGEXP is defined at the bottom of this file.
* Use the regular expression pattern WORD_PATTERN to split
* a string into words, and use Pattern.splitAsStream(String)
* to do the splitting. WORD_PATTERN is defined at the bottom
* of this file.
*
* @throws IOException
*/
......@@ -68,7 +71,7 @@ public class E_IntermediateStreams {
//BEGINREMOVE
List<String> output =
reader.lines()
.flatMap(line -> Arrays.stream(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.collect(Collectors.toList());
// Alternatively, Stream.of() can be used instead of Arrays.stream().
//ENDREMOVE
......@@ -109,7 +112,7 @@ public class E_IntermediateStreams {
//BEGINREMOVE
List<String> output =
reader.lines()
.flatMap(line -> Stream.of(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.filter(word -> word.length() >= 8)
.map(String::toLowerCase)
.sorted()
......@@ -141,7 +144,7 @@ public class E_IntermediateStreams {
//BEGINREMOVE
List<String> result =
reader.lines()
.flatMap(line -> Stream.of(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.filter(word -> word.length() >= 8)
.map(String::toLowerCase)
.sorted(Comparator.reverseOrder())
......@@ -172,7 +175,7 @@ public class E_IntermediateStreams {
//BEGINREMOVE
List<String> result =
reader.lines()
.flatMap(line -> Stream.of(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.map(String::toLowerCase)
.distinct()
.sorted(Comparator.comparingInt(String::length)
......@@ -219,7 +222,7 @@ public class E_IntermediateStreams {
LongAdder adder = new LongAdder();
long distinctCount =
reader.lines()
.flatMap(line -> Stream.of(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.map(String::toLowerCase)
.peek(s -> adder.increment())
.distinct()
......@@ -246,7 +249,8 @@ public class E_IntermediateStreams {
// ========================================================
static final String REGEXP = "[- .:,]+"; // for splitting into words
// Pattern for splitting a string into words
static final Pattern WORD_PATTERN = Pattern.compile("[- .:,]+");
private BufferedReader reader;
......
......@@ -17,6 +17,7 @@ import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;
......@@ -70,7 +71,7 @@ public class F_AdvancedStreams {
//BEGINREMOVE
String result =
reader.lines()
.flatMap(line -> Arrays.stream(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.reduce((a, b) -> b)
.get();
//ENDREMOVE
......@@ -97,7 +98,7 @@ public class F_AdvancedStreams {
//BEGINREMOVE
Map<Integer, List<String>> result =
reader.lines()
.flatMap(line -> Arrays.stream(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.collect(Collectors.groupingBy(String::length));
//ENDREMOVE
......@@ -129,7 +130,7 @@ public class F_AdvancedStreams {
//BEGINREMOVE
Map<Integer, Long> result =
reader.lines()
.flatMap(line -> Arrays.stream(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.collect(Collectors.groupingBy(String::length, Collectors.counting()));
//ENDREMOVE
......@@ -173,7 +174,7 @@ public class F_AdvancedStreams {
//BEGINREMOVE
Map<String, Long> result =
reader.lines()
.flatMap(line -> Stream.of(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
// or use word -> word instead of Function.identity()
......@@ -226,7 +227,7 @@ public class F_AdvancedStreams {
//BEGINREMOVE
Map<String, Map<Integer, List<String>>> result =
reader.lines()
.flatMap(line -> Stream.of(line.split(REGEXP)))
.flatMap(line -> WORD_PATTERN.splitAsStream(line))
.collect(Collectors.groupingBy(word -> word.substring(0,1),
Collectors.groupingBy(String::length)));
//ENDREMOVE
......@@ -300,7 +301,8 @@ public class F_AdvancedStreams {
// ========================================================
static final String REGEXP = "[- .:,]+"; // for splitting into words
// Pattern for splitting a string into words
static final Pattern WORD_PATTERN = Pattern.compile("[- .:,]+");
private BufferedReader reader;
......
* Balloon stuff -- a bit complicated, but useful to show constructor references
* Maurice's forEach example List<StringBuilder>
* reorganize files:
C - default methods
D - simple streams and collectors
E - composite collectors
F - custom collectors
G - challenges
Java 8 Lambdas Hands-on Lab Materials
(version for late 2016 conferences)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment