Stream API

1. 创建 Stream

  • 从集合创建
    • 集合类(如ListSet)都有stream()方法来获取一个顺序流,parallelStream()方法来获取一个并行流。
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class StreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);

        // 创建顺序流
        Stream<Integer> stream = numbers.stream();

        // 创建并行流
        Stream<Integer> parallelStream = numbers.parallelStream();
    }
}

顺序流

  1. 定义与执行方式:顺序流按照元素在数据源中的顺序依次处理每个元素。也就是说,对于流中的每一个操作,都是前一个元素处理完成后,再处理下一个元素。例如,当对一个包含多个元素的列表创建顺序流,并对其进行过滤操作时,会从列表的第一个元素开始,逐个判断是否满足过滤条件,处理完第一个元素后接着处理第二个,依此类推。

并行流

  1. 定义与执行方式:并行流利用多线程并行处理流中的元素。它将流中的数据分割成多个部分,每个部分由一个独立的线程进行处理,从而可以充分利用多核处理器的计算能力,提高处理速度。例如,对一个大数据集创建并行流并进行过滤操作时,数据集会被分成多个子数据集,每个子数据集由不同的线程并行地进行过滤处理。

demo:
public class StreamComparison {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// 顺序流操作
long sequentialStartTime = System.currentTimeMillis();
List<Integer> sequentialResult = numbers.stream()
.map(n -> n * n)
.collect(Collectors.toList());
long sequentialEndTime = System.currentTimeMillis();
System.out.println(“顺序流结果: ” + sequentialResult);
System.out.println(“顺序流处理时间: ” + (sequentialEndTime – sequentialStartTime) + ” 毫秒”);

// 并行流操作
long parallelStartTime = System.currentTimeMillis();
List<Integer> parallelResult = numbers.parallelStream()
.map(n -> n * n)
.collect(Collectors.toList());
long parallelEndTime = System.currentTimeMillis();
System.out.println(“并行流结果: ” + parallelResult);
System.out.println(“并行流处理时间: ” + (parallelEndTime – parallelStartTime) + ” 毫秒”);
}
}

example:

@Override
    public Map<String, Object> qryStaffDetailInfo(Map<String, Object> params) throws Exception {
        Map retMap = new HashMap<String, Object>();
        // 获取员工主键
        String staffId = (String) params.get("staffId");
        BizObject bizObject = MetaDaoHelper.findById("hred.staff.Staff", Long.parseLong(staffId), "hrcloud-staff-mgr");
        List<BizObject> staffJobList = bizObject.getBizObjects("staffJob", BizObject.class);
        List<BizObject> filterStaffJobList = new ArrayList<>();
        List<BizObject> filterStaffEduList = new ArrayList<>();
        List<BizObject> filterStaffOrgRelList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(staffJobList)) {
            filterStaffJobList = staffJobList.stream().filter(t -> (Integer) t.get("dr") == 0 && (Boolean) t.get("isMainJob") && t.get("endDate") == null).collect(Collectors.toList());
        }
        List<BizObject> staffEduList = bizObject.getBizObjects("staffEdu", BizObject.class);
        if (CollectionUtils.isNotEmpty(staffEduList)) {
            filterStaffEduList = staffEduList.stream().filter(t -> (Integer) t.get("dr") == 0 && (Boolean) t.get("isPrefs")).collect(Collectors.toList());
        }
        List<BizObject> staffOrgRelList = bizObject.getBizObjects("staffOrgRel", BizObject.class);
        if (CollectionUtils.isNotEmpty(staffOrgRelList)) {
            filterStaffOrgRelList = staffOrgRelList.stream().filter(t -> (Integer) t.get("dr") == 0 && t.get("endDate") == null).collect(Collectors.toList());
        }
        retMap.put("staffJob", filterStaffJobList);
        retMap.put("staffEdu", filterStaffEduList);
        retMap.put("staffOrgRel", filterStaffOrgRelList);
        return retMap;
  1. staffJobList.stream()
    • 这一步将 staffJobList(一个 List<BizObject>)转换为一个流(Stream<BizObject>)。流是一种支持顺序和并行聚合操作的元素序列,它允许以一种声明式的方式对集合中的元素进行处理。通过将列表转换为流,后续可以使用 Stream API 提供的丰富操作,如过滤、映射、排序等。
  2. .filter(t -> (Integer) t.get("dr") == 0 && (Boolean) t.get("isMainJob") && t.get("endDate") == null)
    • filter 是 Stream API 中的一个中间操作,它接受一个 Predicate(断言)作为参数,用于对流中的每个元素进行筛选。只有满足断言条件的元素才会被保留在新的流中。
    • t -> (Integer) t.get("dr") == 0 && (Boolean) t.get("isMainJob") && t.get("endDate") == null 是一个 Lambda 表达式,它定义了过滤的条件。这里的 t 代表流中的每个 BizObject 元素。
    • (Integer) t.get("dr") == 0t.get("dr") 从 BizObject 中获取名为 dr 的属性值,并将其强制转换为 Integer 类型,然后判断该值是否等于 0。这里的 dr 可能是一个用于标记数据状态的字段,例如 0 可能表示有效数据。
    • (Boolean) t.get("isMainJob"):获取名为 isMainJob 的属性值并强制转换为 Boolean 类型,判断其是否为 true。这个属性可能用于标识该工作是否为员工的主要工作。
    • t.get("endDate") == null:检查 BizObject 中名为 endDate 的属性值是否为 null。这可能表示该工作的结束日期为空,即当前工作仍在进行中。
    • 这三个条件通过 &&(逻辑与)运算符连接,意味着只有当一个 BizObject 同时满足这三个条件时,它才会被保留在经过过滤后的流中。
  3. .collect(Collectors.toList())
    • collect 是 Stream API 中的一个终止操作,它将流中的元素累积到一个可变的结果容器中,这里使用 Collectors.toList() 将过滤后的流中的元素收集到一个新的 List 中。Collectors 类提供了许多静态方法来创建不同类型的收集器,toList() 方法创建的收集器会将流中的元素收集到一个 List 中。最终,这个新的 List 被赋值给 filterStaffJobList

博客内容均系原创,未经允许严禁转载!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇