Here are the examples of the Java 8 Stream
Methods in Stream interface
collect, forEach, filter, flatMap, flatMapToInt, limit, map, mapToInt, of, parallel, peek, reduce, stream.
flatMap: a set of collections is required to produce the final flattered collection.parallel: a set of collections is required to run the combiner function.
peek: very useful for debugging.
collect and reduce: there are Collectors class that provides many convenient methods.
Methods in Collectors
averagingDouble, groupBy, partitionBy, toMap, toList, toSet.
import
java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import
java.util.Optional;
import
java.util.OptionalInt;
import java.util.Set;
import java.util.TreeMap;
import
java.util.function.Function;
import
java.util.stream.Collectors;
import
java.util.stream.Stream;
import org.junit.Test;
public class StreamExamples {
static List<Employee> employeeList = Arrays.asList(new Employee("Tom
Jones", 45, "A"),
new Employee("Harry
Major", 25, "B"), new Employee("Ethan Hardy", 65, "A"),
new Employee("Nancy
Smith", 15, "C"), new Employee("Deborah Sprightly", 29, "A"));
@Test
public void
testFlatMapAndPeek() {
List<String> originalStringList = Arrays.asList("Peter", "Adam", "John");
Stream<String> a = originalStringList.stream();
// Object array is required,
s.split("") returns a String[], primitive
// arrays such as char[] do not
work here.
Stream<String[]> b = a.map(s -> s.split("")).peek(s -> System.out.println(Arrays.toString(s)));
Stream<String> d = b.flatMap(c -> Arrays.stream(c));
Optional<String> e = d.limit(10).reduce((s1, s2) -> s1 + s2);
System.out.println(e.get());
}
@Test
public void
testFlatMapAndFilterAndCount() {
long count = Stream.of("Adam", "Peter", "Mike", "alice", "Linda", "pam").map(s -> s.toUpperCase())
.filter(s -> s.startsWith("A")).map(s -> s.split("")).flatMap(s -> Arrays.stream(s)).count();
System.out.println("count:" + count);
employeeList.stream().map(emp -> emp.getName()).forEach(System.out::println);
employeeList.stream().map(emp -> emp.getName().split("")).flatMap(array -> Arrays.stream(array))
.map(str -> str.toUpperCase()).filter(str -> !(str.equals(" ")))
.forEach(str -> System.out.println(str));
}
@Test
public void
testMapToIntAndSum() {
Stream<Integer> stream = Stream.of(1,
2, 3, 4);
int sum = stream.filter(i -> i > 1).mapToInt(i -> i).sum();
System.out.println("sum:" + sum);
}
@Test
public void
testStreamWithPrimitiveChar() {
List<String> strList = new
ArrayList<>();
strList.add("Peter");
strList.add("Jane");
int[] ci = strList.stream().map(s -> s.chars()).flatMapToInt(i -> i).toArray();
for (int c : ci) {
System.out.println((char) c);
}
}
@Test
public void testReduce() {
System.out.println("===testReduce===");
String r = Stream.of("Peter", "Jane").map(s -> s.split("")).flatMap(s -> Arrays.stream(s))
.peek(System.out::println).reduce("s", (a, b) -> a + b);
System.out.println("r:" + r);
OptionalInt sum = Stream.of("Peter", "Jane").map(s -> s.chars()).flatMapToInt(i -> i).peek(System.out::println)
.reduce((i, j) -> {
return i + j;
});
System.out.println("sum:" + sum.getAsInt());
String reduced = Stream.of("123", "456").parallel().map(s -> s.split("")).flatMap(i -> Arrays.stream(i))
.peek(System.out::println).reduce("s", (i, j) -> i + ":" + j, (k, l) -> k + ";" + l);
System.out.println("reduced:" + reduced);
int reduced1 = Stream.of("123", "456").parallel().map(s -> s.split("")).flatMap(i -> Arrays.stream(i))
.peek(System.out::println).reduce(0,
(i, j) -> i + Integer.parseInt(j), (k, l) -> k * l);
System.out.println("reduced1:" + reduced1);
}
@Test
public void
testFunctionInterfaces() {
Function<List<String>,
List<String>> toUppderCase = a -> a.stream().map(s -> s.toUpperCase())
.collect(Collectors.toList());
Function<List<String>,
List<String>> filter = a -> a.stream().filter(s -> s.startsWith("A"))
.collect(Collectors.toList());
Function<List<String>,
StringBuilder> accumulateResult = a -> a.stream().collect(StringBuilder::new,
(response, element) -> response.append(" ").append(element),
(response1, response2) -> response1.append(",").append(response2.toString()));
Function<List<String>,
StringBuilder> f = toUppderCase.andThen(filter).andThen(accumulateResult);
System.out.println("##############################################");
System.out.println(f.apply(Arrays.asList("Adam", "Peter", "Mike", "alice", "Linda", "pam")));
}
@Test
public void testCollectors() {
System.out.println("===testCollectors===");
String joinedResult = Stream.of("Adam", "Peter", "Mike", "alice", "Linda", "pam").map(s -> s.toUpperCase())
.filter(s -> s.startsWith("A")).collect(Collectors.joining(",", "name:[", "]"));
System.out.println("joinedResult:" + joinedResult);
Map<Integer,
List<String>> a = Stream.of("Adam", "Peter", "Mike", "alice", "Linda", "pam")
.map(s -> s.toUpperCase()).collect(Collectors.groupingBy(String::length));
System.out.println("groups:" + a);
Map<String,
List<Employee>> b = employeeList.stream().collect(Collectors.groupingBy(e -> e.getDepartment()));
System.out.println("groups:" + b);
Map<String,
Set<String>> c = employeeList.stream().collect(Collectors.groupingBy(Employee::getDepartment,
TreeMap::new, Collectors.mapping(Employee::getName,
Collectors.toSet())));
System.out.println("groups:" + c);
Double averageAge = employeeList.stream().collect(Collectors.averagingDouble(e -> e.getRate()));
System.out.println("averageAge:" + averageAge);
Map<Boolean,
List<Employee>> d = employeeList.stream()
.collect(Collectors.partitioningBy(e -> e.getRate() >
30));
System.out.println("groups:" + d);
Map<Boolean,
Set<String>> f = employeeList.stream().collect(Collectors.partitioningBy(e -> e.getRate() > 30,
Collectors.mapping(e -> e.getName(),
Collectors.toSet())));
System.out.println("groups:" + f);
Map<String, String> g = employeeList.stream()
.collect(Collectors.toMap(e -> e.getDepartment(), e -> e.getName(), (a1, a2) -> a1 + "," + a2));
System.out.println("groups:" + g);
}
@Test
public void
testCollectAndParallel() {
StringBuilder result = Stream.of("Adam", "Peter", "Mike", "alice", "Linda", "pam").map(s -> s.toUpperCase())
.collect(StringBuilder::new, (stringBuilder, s) -> {
int i = stringBuilder.length();
if (i == 0) {
stringBuilder.append(s);
} else {
stringBuilder.append("/").append(s);
}
}, (response1, response2) -> response1.append(",").append(response2.toString()));
System.out.println("result of
non-parallel run:" + result);
String result2 = Stream
.of(Arrays.asList("Adam", "Alan"), Arrays.asList("Peter", "Pam"),
Arrays.asList("Mike", "alice", "Linda"))
.parallel().flatMap(s -> s.stream()).collect(StringBuilder::new, (stringBuilder, s) -> {
int i = stringBuilder.length() + 1;
if (i == 0) {
stringBuilder.append(s);
} else {
stringBuilder.append("/").append(s);
}
}, (response1, response2) -> response1.append(",").append(response2.toString())).toString();
System.out.println("result of
parallel run:" + result2);
}
public static class Employee {
@Override
public String toString()
{
return "Employee
[name=" + name + ", rate=" + rate + ", department=" + department + "]";
}
private final String name;
private final Integer rate;
private final String department;
public Employee(final String name, final Integer rate, final String department) {
this.name = name;
this.rate = rate;
this.department = department;
}
public String getName() {
return name;
}
public Integer getRate()
{
return rate;
}
public String
getDepartment() {
return department;
}
}
}
|