1. 创建 Stream
- 从集合创建:
- 集合类(如
List
、Set
)都有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();
}
}
顺序流
- 定义与执行方式:顺序流按照元素在数据源中的顺序依次处理每个元素。也就是说,对于流中的每一个操作,都是前一个元素处理完成后,再处理下一个元素。例如,当对一个包含多个元素的列表创建顺序流,并对其进行过滤操作时,会从列表的第一个元素开始,逐个判断是否满足过滤条件,处理完第一个元素后接着处理第二个,依此类推。
并行流
- 定义与执行方式:并行流利用多线程并行处理流中的元素。它将流中的数据分割成多个部分,每个部分由一个独立的线程进行处理,从而可以充分利用多核处理器的计算能力,提高处理速度。例如,对一个大数据集创建并行流并进行过滤操作时,数据集会被分成多个子数据集,每个子数据集由不同的线程并行地进行过滤处理。
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;
staffJobList.stream()
:- 这一步将
staffJobList
(一个List<BizObject>
)转换为一个流(Stream<BizObject>
)。流是一种支持顺序和并行聚合操作的元素序列,它允许以一种声明式的方式对集合中的元素进行处理。通过将列表转换为流,后续可以使用 Stream API 提供的丰富操作,如过滤、映射、排序等。
- 这一步将
.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") == 0
:t.get("dr")
从BizObject
中获取名为dr
的属性值,并将其强制转换为Integer
类型,然后判断该值是否等于0
。这里的dr
可能是一个用于标记数据状态的字段,例如0
可能表示有效数据。(Boolean) t.get("isMainJob")
:获取名为isMainJob
的属性值并强制转换为Boolean
类型,判断其是否为true
。这个属性可能用于标识该工作是否为员工的主要工作。t.get("endDate") == null
:检查BizObject
中名为endDate
的属性值是否为null
。这可能表示该工作的结束日期为空,即当前工作仍在进行中。- 这三个条件通过
&&
(逻辑与)运算符连接,意味着只有当一个BizObject
同时满足这三个条件时,它才会被保留在经过过滤后的流中。
.collect(Collectors.toList())
:collect
是 Stream API 中的一个终止操作,它将流中的元素累积到一个可变的结果容器中,这里使用Collectors.toList()
将过滤后的流中的元素收集到一个新的List
中。Collectors
类提供了许多静态方法来创建不同类型的收集器,toList()
方法创建的收集器会将流中的元素收集到一个List
中。最终,这个新的List
被赋值给filterStaffJobList
。