Stream流是Java 8中新增的一个API,它是一种处理集合的方式,可以支持函数式编程风格。Stream流可以让你以一种简单、清晰的方式来处理集合中的元素,避免了繁琐的for循环和if语句。
下面是一些关于Stream流的基本知识:
Stream流的产生
使用Stream流需要先有一个数据源,可以是集合、数组等等。我们可以通过集合的stream()方法或者Arrays.stream()方法来获取一个Stream流。
例如:
java
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
Stream流的中间操作
Stream流的中间操作是指对数据进行过滤、映射等操作。常用的中间操作包括filter()、map()、sorted()、distinct()等等。
例如:
java
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
stream.filter(s -> s.length() > 5)
.sorted()
.map(String::toUpperCase)
.forEach(System.out::println);
上面的代码中,首先使用filter()方法对元素进行过滤,只留下长度大于5的元素;然后使用sorted()方法进行排序;接着使用map()方法将元素转换成大写字母;最后使用forEach()方法遍历输出每个元素。
Stream流的终止操作
Stream流的终止操作是指对数据进行最终的处理,例如将数据转换成List、Set、Map等数据结构,或者对数据进行计算、查找等操作。常用的终止操作包括collect()、reduce()、count()、min()、max()等等。
例如:
java
List<String> list = Arrays.asList("apple", "banana", "orange");
long count = list.stream().filter(s -> s.length() > 5).count();
System.out.println("长度大于5的元素个数为:" + count);
上面的代码中,使用count()方法对长度大于5的元素进行计数,并输出结果。
这些是Stream流的基本知识,你可以进一步深入学习Stream流的操作方法,以及Stream流与并行流的区别和应用场景。
深入学习Stream流的操作方法
除了基本的中间操作和终止操作外,Stream流还提供了许多有用的操作方法,这些方法可以帮助我们更加方便地处理集合中的元素。以下是一些常用的操作方法:
flatMap()
flatMap()方法可以将一个Stream流中的每个元素转换成一个新的Stream流,然后将这些新的Stream流合并成一个Stream流。这个方法可以用于将多个集合合并成一个集合,并去重。
例如:
java
List<String> list1 = Arrays.asList("apple", "banana", "orange");
List<String> list2 = Arrays.asList("grape", "banana", "watermelon");
List<String> result = Stream.of(list1, list2)
.flatMap(Collection::stream)
.distinct()
.collect(Collectors.toList());
System.out.println(result); //输出结果为:[apple, banana, orange, grape, watermelon]
上面的代码中,首先使用Stream.of()方法将两个集合转换成一个Stream流,然后使用flatMap()方法将每个元素转换成一个新的Stream流,最后使用distinct()方法去重,并使用collect()方法将结果转换成一个List集合。
peek()
peek()方法可以在Stream流中的每个元素执行一个操作,并将Stream流传递给下一个操作。这个方法可以用于调试Stream流中的每个元素。
例如:
java
List<String> list = Arrays.asList("apple", "banana", "orange");
long count = list.stream()
.peek(s -> System.out.println("原始数据:" + s))
.filter(s -> s.length() > 5)
.peek(s -> System.out.println("过滤后数据:" + s))
.count();
System.out.println("长度大于5的元素个数为:" + count);
上面的代码中,使用peek()方法在过滤之前和过滤之后打印出每个元素,用于调试和理解Stream流的处理过程。
limit()和skip()
limit()方法可以限制Stream流中的元素数量,而skip()方法可以跳过Stream流中的前几个元素。这两个方法可以用于分页等操作。
例如:
java
List<String> list = Arrays.asList("apple", "banana", "orange", "grape", "watermelon");
List<String> result = list.stream().skip(2).limit(2).collect(Collectors.toList());
System.out.println(result); //输出结果为:[orange, grape]
上面的代码中,使用skip()方法跳过前两个元素,然后使用limit()方法只取前两个元素,最后使用collect()方法将结果转换成一个List集合。
reduce()
reduce()方法可以对Stream流中的所有元素进行归约操作,返回一个Optional对象。这个方法可以用于对Stream流中的元素进行求和、求最大值、求最小值等操作。
例如:
java
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Optional<Integer> sum = list.stream().reduce(Integer::sum);
System.out.println("求和结果为:" + sum.get()); //输出结果为:15
举一个学习的例子
假设有一个包含员工信息的List集合,每个员工信息包括姓名、年龄和工资三个字段。我们想要对这个集合进行处理,得到所有员工工资大于5000的员工的姓名,并按照年龄从小到大排序。
我们可以使用Stream流来实现这个需求,具体的代码如下:
java
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class EmployeeTest {
public static void main(String[] args) {
List<Employee> employeeList = Arrays.asList(
new Employee("Tom", 25, 6000),
new Employee("Jerry", 30, 7000),
new Employee("Alice", 23, 5500),
new Employee("Bob", 28, 5000),
new Employee("Mike", 35, 8000)
);
List<String> result = employeeList.stream()
.filter(e -> e.getSalary() > 5000)
.sorted(Comparator.comparingInt(Employee::getAge))
.map(Employee::getName)
.collect(Collectors.toList());
System.out.println(result); //输出结果为:[Alice, Tom, Jerry, Mike]
}
}
class Employee {
private String name;
private int age;
private int salary;
public Employee(String name, int age, int salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int getSalary() {
return salary;
}
}
上面的代码中,首先定义了一个Employee类表示员工信息,然后创建了一个包含五个员工信息的List集合。接着使用Stream流对这个集合进行处理,首先使用filter()方法过滤出工资大于5000的员工,然后使用sorted()方法按照年龄从小到大排序,最后使用map()方法将每个员工的姓名转换成一个新的Stream流,最后使用collect()方法将结果转换成一个List集合。最终得到的结果就是所有工资大于5000的员工的姓名,并按照年龄从小到大排序的结果。