学习Stream流

Stream流是Java 8中新增的一个API,它是一种处理集合的方式,可以支持函数式编程风格。Stream流可以让你以一种简单、清晰的方式来处理集合中的元素,避免了繁琐的for循环和if语句。

下面是一些关于Stream流的基本知识:

  1. Stream流的产生

使用Stream流需要先有一个数据源,可以是集合、数组等等。我们可以通过集合的stream()方法或者Arrays.stream()方法来获取一个Stream流。

例如:

java

List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> stream = list.stream();
  1. 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()方法遍历输出每个元素。

  1. 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流还提供了许多有用的操作方法,这些方法可以帮助我们更加方便地处理集合中的元素。以下是一些常用的操作方法:

  1. 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集合。

  1. 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流的处理过程。

  1. 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集合。

  1. 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的员工的姓名,并按照年龄从小到大排序的结果。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值