stream使用案例
1.1 查找所有的偶数并求和
public static void p1() {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
int sum = numbers.stream()
.filter(num -> num % 2 == 0)
.mapToInt(Integer::intValue)
.sum() ;
System.err.printf("result: %s%n", sum) ;
}
1.2 查找并打印长度大于 5 的字符串个数
public static void p2() {
List<String> strings = Arrays.asList(
"apple", "banana", "grape",
"watermelon", "kiwi", "orange");
Long count = strings.stream()
.filter(str -> str.length() > 5)
.count() ;
System.err.printf("result: %s%n", count) ;
}
1.3 处理每一个元素最后返回新集合
public static void p3() {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> squares = numbers.stream()
.map(num -> num * num)
.collect(Collectors.toList()) ;
System.err.printf("result: %s%n", squares) ;
}
将每一个元素进行平方操作,最后返回一个新的集合。输出结果:
result: [1, 4, 9, 16, 25]
1.4 找出整数列表中的最大元素
public static void p4() {
List<Integer> numbers = Arrays.asList(10, 5, 25, 15, 30);
int max = numbers.stream()
.mapToInt(Integer::intValue)
.max()
.getAsInt();
System.err.printf("result: %s%n", max) ;
}
1.5 将列表中的所有字符串连接成一个字符串
public static void p5() {
List<String> fruits = Arrays.asList("apple", "banana", "cherry","coconut", "apple");
String concat =fruits.stream()
.collect(Collectors.joining()) ;
System.err.printf("result: %s%n", concat) ;
}
1.6 转成大写再排序
public static void p6() {
List<String> fruits = Arrays.asList("apple", "Banana", "Grape", "orange", "kiwi");
List<String> sortedUppercase = fruits.stream()
.map(String::toUpperCase)
.sorted()
.collect(Collectors.toList());
System.err.printf("result: %s%n", sortedUppercase) ;
}
先将字符串转为大写,然后在进行排序,输出结果:
result: [APPLE, BANANA, GRAPE, KIWI, ORANGE]
1.7 计算double类型平均值
public static void p7() {
List<Double> doubles = Arrays.asList(1.0, 2.0, 3.0, 4.0, 5.0);
double average = doubles.stream()
.mapToDouble(Double::doubleValue)
.average()
.getAsDouble() ;
System.err.printf("result: %s%n", average) ;
}
1.8 删除重复元素
public static void p8() {
List<String> words = Arrays.asList("apple", "banana", "apple", "orange", "banana", "kiwi");
List<String> uniqueWords = words.stream()
.distinct()
.collect(Collectors.toList()) ;
System.err.printf("result: %s%n", uniqueWords) ;
}
1.9 检查所有元素是否符合条件
public static void p9() {
List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);
boolean allEven = numbers.stream()
.allMatch(n -> n%2 == 0) ;
System.err.printf("result: %s%n", allEven) ;
}
1.10 检查集合中是否包含特定元素
public static void p10() {
List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10);
boolean exists = numbers.stream()
.anyMatch(n -> n.equals(8)) ;
System.err.printf("result: %s%n", exists) ;
}
1.11 查找流中最长的字符串
public static void p11() {
List<String> fruits = Arrays.asList("apple", "banana", "cherry", "coconut", "apple") ;
int max = fruits.stream()
.mapToInt(String::length)
.max()
.getAsInt() ;
System.err.printf("result: %s%n", max) ;
}
1.12 从流中删除null值
public static void p12() {
List<String> fruits = Arrays.asList("apple", "banana", "cherry", null,"coconut", "apple");
List<String> nonNullValues = fruits.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList()) ;
System.err.printf("result: %s%n", nonNullValues) ;
}
过滤为null的值,输出结果:
result: [apple, banana, cherry, coconut, apple]
1.13 分组并查找最大值
public static void p13() {
List<Employee> employees =new ArrayList<>() ;
employees.add(new Employee("Alice","HR",50000.0)) ;
employees.add(new Employee("Bob","IT",60000.0)) ;
employees.add(new Employee("Charlie","Finance",55000.0)) ;
employees.add(new Employee("David","IT",70000.0)) ;
employees.add(new Employee("Eva", "HR", 45000.0)) ;
employees.add(new Employee("Frank","Finance",58000.0));
Map<String, Optional<Employee>> highestSalaryPerDept = employees.stream()
.collect(Collectors.groupingBy(
Employee::getDepartment,
Collectors.maxBy(Comparator.comparingDouble(Employee::getSalary))
));
highestSalaryPerDept.forEach((key, value) -> {
System.err.printf("部门: %s, \t最高薪: %s%n", key, value.get()) ;
});
}
输出结果:
2.14 查找列表中第二小的元素
public static void p14() {
List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10) ;
Optional<Integer> secondSmallest = numbers.stream()
.distinct()
.sorted()
.skip(1)
.findFirst() ;
System.err.printf("result: %s%n", secondSmallest) ;
}
1.15 查找两个列表的交集
public static void p15() {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5) ;
List<Integer> list2 = Arrays.asList(4, 5, 6, 7,8) ;
List<Integer> intersection = list1.stream()
.filter(list2::contains)
.collect(Collectors.toList()) ;
System.err.printf("result: %s%n", intersection) ;
}
1.16 并行处理提升性能
使用并行流可以通过BaseStream.parallel或Collection#parallelStream操作,如下计算1亿个数的求和
public static void main(String[] args) {
double[] arr = IntStream.range(0, 100_000_000)
.mapToDouble(i -> new Random().nextDouble() * 100000)
.toArray() ;
computeSumOfSquareRoots(arr);
}
public static void computeSumOfSquareRoots(double[] arr) {
double serialSum = computeSerialSum(DoubleStream.of(arr));
System.out.println("Serial Sum: " + serialSum);
double parallelSum = computeParallelSum(DoubleStream.of(arr));
System.out.println("Parallel Sum: " + parallelSum);
}
public static double computeSerialSum(DoubleStream stream) {
long startTime = System.currentTimeMillis();
double sum = stream.reduce(0.0D, (l, r) -> l + r) ;
long endTime = System.currentTimeMillis();
System.out.println("Serial Computation Time: " + (endTime - startTime) + " ms");
return sum;
}
public static double computeParallelSum(DoubleStream stream) {
long startTime = System.currentTimeMillis();
double sum = stream.parallel().reduce(0, (l, r) -> l + r) ;
long endTime = System.currentTimeMillis();
System.out.println("Parallel Computation Time: " + (endTime - startTime) + " ms");
return sum;
}
运行结果
SerialComputation Time: 73 ms
SerialSum: 5.000114159154823E12
ParallelComputation Time: 38 ms
ParallelSum: 5.000114159151367E12