MST
星途 面试题库

面试题:Java Stream延迟执行在复杂业务逻辑中的优化策略

在一个涉及多步骤数据处理和复杂业务规则的Java应用中,使用Stream函数式接口实现相关逻辑。要求充分利用延迟执行特性进行性能优化,并且在处理过程中需要进行动态分支判断(例如根据数据的某些属性决定后续执行不同的处理流程)。请描述你的设计思路,并给出关键代码片段。
17.1万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 延迟执行利用:Stream的操作分为中间操作和终端操作,中间操作是延迟执行的。我们可以将多个中间操作(如filter、map等)链式调用,直到调用终端操作时才会真正执行,这样可以减少不必要的计算。
  2. 动态分支判断:在Stream的处理过程中,通过map或者flatMap等操作,结合条件判断语句(如if - else)来决定数据后续的处理流程。根据数据的属性,将数据导向不同的处理路径。

关键代码片段

假设我们有一个User类,包含agegender属性,并且有一个List<User>,我们要根据agegender进行不同的处理。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

class User {
    private int age;
    private String gender;

    public User(int age, String gender) {
        this.age = age;
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public String getGender() {
        return gender;
    }
}

public class StreamDynamicBranch {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(20, "male"));
        userList.add(new User(30, "female"));
        userList.add(new User(18, "male"));

        List<String> result = userList.stream()
               .map(user -> {
                    if (user.getAge() >= 18 && "male".equals(user.getGender())) {
                        return "成年男性: " + user.getAge();
                    } else if (user.getAge() >= 18 && "female".equals(user.getGender())) {
                        return "成年女性: " + user.getAge();
                    } else {
                        return "未成年: " + user.getAge();
                    }
                })
               .collect(Collectors.toList());

        result.forEach(System.out::println);
    }
}

在上述代码中:

  1. 首先创建了User类及其实例,并添加到List中。
  2. 使用StreamuserList进行处理,在map操作中根据agegender属性进行动态分支判断,返回不同格式的字符串。
  3. 最后通过collect终端操作将处理结果收集到List中并输出。