草稿 Stream

概念

  • 顺序遍历每一个进行操作 和 对集合的聚合操作 可以类比数据库的聚合函数 sequential and parallel aggregate operations

顶层接口

  • BaseStream

    • 终端操作
      • Iterator<T> iterator() 返回集合的迭代器
      • Spliterator<T> spliterator() 返回集合的分割器 没搞懂怎么用,干啥用的?
    • 中间状态操作

      • S sequential() 返回一个顺序流

                int[] array = {1,2,4,6,3,1,3};
                Stream<int[]> sequential = Stream.of(array).sequential();
      • S parallel() 返回一个并行流??
      • S unordered() 返回一个无序流 ??
    • 其他操作

      • boolean isParallel() 判断当前流是否可执行终端操作
      • S onClose(Runnable closeHandler) 当流被关闭时触发的动作。
  • Collector

    • Supplier<A> supplier() 返回一个可变的容器??
    • BiConsumer<A,T> accumulator() 把多个值折叠入一个可变容器???
    • BinaryOperator<A> combiner() 组合两个结果
    • Function<A,R> finisher() 把一个中间结果变成一个最终结果
    • Set<Collector.Characteristics> characteristics() 特性集合???
    • static <T,R> Collector<T,R,R> of(Supplier<R> supplier,
      BiConsumer<R,T> accumulator,
      BinaryOperator<R> combiner,
      Collector.Characteristics... characteristics)
      Collector的构造器
         Collector<Widget, ?, TreeSet<Widget>> intoSet =
             Collector.of(TreeSet::new, TreeSet::add,
                          (left, right) -> { left.addAll(right); return left; });
         Collector<Employee, ?, Integer> summingSalaries
             = Collectors.summingInt(Employee::getSalary))
    
     Collector<Employee, ?, Map<Department, Integer>> summingSalariesByDept
         = Collectors.groupingBy(Employee::getDepartment, summingSalaries);
  • DoubleStream double相关的所有的你能想到的操作

    • DoubleStream peek(DoubleConsumer action)
           DoubleStream.of(1, 2, 3, 4)
               .filter(e -> e > 2)
               .peek(e -> System.out.println("Filtered value: " + e))
               .map(e -> e * e)
               .peek(e -> System.out.println("Mapped value: " + e))
               .sum();
    
         double sum = widgets.stream()
                             .filter(w -> w.getColor() == RED)
                             .mapToDouble(w -> w.getWeight())
                             .sum();
  • Collectors

     // Accumulate names into a List
         List<String> list = people.stream().map(Person::getName).collect(Collectors.toList());
    
         // Accumulate names into a TreeSet
         Set<String> set = people.stream().map(Person::getName).collect(Collectors.toCollection(TreeSet::new));
    
         // Convert elements to strings and concatenate them, separated by commas
         String joined = things.stream()
                               .map(Object::toString)
                               .collect(Collectors.joining(", "));
    
         // Compute sum of salaries of employee
         int total = employees.stream()
                              .collect(Collectors.summingInt(Employee::getSalary)));
    
         // Group employees by department
         Map<Department, List<Employee>> byDept
             = employees.stream()
                        .collect(Collectors.groupingBy(Employee::getDepartment));
    
         // Compute sum of salaries by department
         Map<Department, Integer> totalByDept
             = employees.stream()
                        .collect(Collectors.groupingBy(Employee::getDepartment,
                                                       Collectors.summingInt(Employee::getSalary)));
    
         // Partition students into passing and failing
         Map<Boolean, List<Student>> passingFailing =
             students.stream()
                     .collect(Collectors.partitioningBy(s -> s.getGrade() >= PASS_THRESHOLD));

用例

 - sum 求和
     int sum = widgets.stream()
                      .filter(w -> w.getColor() == RED)
                      .mapToInt(w -> w.getWeight())
                      .sum();
<think>好的,用户现在的问题是:如何通过activity对象判断任务是否为草稿状态,可能与工作流或任务管理相关,特别是涉及到taskDefKey和工作流。我需要结合之前的对话和用户提供的引用来解决这个问题。首先回顾之前的对话,用户之前询问了taskDefKey的含义和作用,我解释了它是流程定义中用户任务的唯一标识符,用于定位任务节点和业务关联。现在用户的问题转向如何判断任务是否为草稿状态,这可能涉及到流程实例的状态管理。用户提供的引用[1]中提到,Activiti负责流程控制,业务数据通过BusinessKey关联,流程变量控制流程走向,任务局部变量记录结果,任务监听器处理特定需求,执行监听器触发业务状态更新。这可能意味着草稿状态可能由业务数据或流程变量来控制,而不是Activiti本身直接提供草稿状态。 Activiti本身并没有内置的“草稿状态”概念,通常草稿状态是业务层面的定义。因此,用户可能需要通过业务数据或流程变量来标记任务是否为草稿。例如,当用户开始填写表单但未提交时,业务系统可能将任务标记为草稿,保存到数据库,并在流程变量中设置一个标识,如isDraft=true。 接下来,用户提到使用activity对象和taskDefKey。可能的思路是:当任务处于某个特定节点(如taskDefKey为draftTask)时,结合流程变量或业务数据来判断是否为草稿状态。例如,在用户任务节点,如果任务尚未完成,并且存在特定的草稿标记变量,则可以视为草稿。需要检查流程实例或任务实例的变量,例如通过RuntimeService或TaskService查询变量。例如,使用taskService.getVariable(taskId, "isDraft")来检查是否存在草稿标识。另外,引用[1]中提到业务服务通过流程变量控制流程走向,这可能包括设置草稿状态。例如,当用户保存草稿时,业务服务设置一个流程变量,如draftStatus="pending",然后在任务处理时检查该变量来判断是否为草稿。 可能的实现步骤包括:1.在流程定义中设计草稿节点或使用现有节点;2.在保存草稿时设置流程变量;3.在查询任务时根据变量判断是否为草稿。此外,需要考虑任务的生命周期。在Activiti中,任务被创建后可能处于未完成状态,此时可能被视为草稿。但用户可能需要更明确的标记,比如用户主动保存为草稿,这时需要额外的变量来标识。最后,需要回答用户如何通过activity对象和taskDefKey来判断草稿状态,可能需要结合任务定义键和流程变量。例如,当任务的taskDefKey是"draftTask"且存在isDraft变量时,判断为草稿。总结:草稿状态是业务层面的概念,需通过流程变量或业务数据结合taskDefKey来实现判断。需要指导用户如何设置和查询这些变量,并结合任务节点进行判断。</think>### Activity任务草稿状态判断方法 在Activiti工作流引擎中,**草稿状态本质上是业务层面的状态标识**,需通过流程变量、任务状态或业务数据组合判断。以下是结合`taskDefKey`和流程特征实现草稿状态检测的核心方法: --- #### 一、基于任务生命周期判断 1. **未提交任务即草稿** - 当任务实例存在但未执行`complete()`操作时,可视为草稿状态: ```java Task task = taskService.createTaskQuery() .taskDefinitionKey("draftTask") // 指定taskDefKey .taskAssignee("user1") .singleResult(); boolean isDraft = (task != null && task.getCreateTime().equals(task.getLastUpdateTime())); ``` - 通过`createTime`与`lastUpdateTime`是否一致判断是否未修改[^1] 2. **流程实例状态关联** ```sql SELECT * FROM ACT_RU_TASK WHERE SUSPENSION_STATE_ = 1 AND TASK_DEF_KEY_ = 'draftTask' AND PROC_INST_ID_ NOT IN ( SELECT PROC_INST_ID_ FROM ACT_RU_EXECUTION WHERE BUSINESS_KEY_ LIKE '%submitted%' ) ``` - 通过排除已提交的业务键(`BUSINESS_KEY_`)识别草稿 --- #### 二、通过流程变量标记 1. **显式草稿标记变量** ```java // 保存草稿时设置变量 taskService.setVariable(taskId, "isDraft", true); // 查询时判断 Boolean isDraft = (Boolean) taskService.getVariable(taskId, "isDraft"); ``` 2. **表单数据完整性检测** 通过`formService`获取表单数据判断是否完成必填项: ```java String formData = formService.getTaskFormData(taskId).getFormProperties() .stream().filter(p -> p.isRequired() && p.getValue() == null) .findAny().isPresent(); boolean isDraft = (formData != null); ``` --- #### 三、结合业务状态设计 1. **业务键(BusinessKey)规则** 在启动流程时设置草稿标识: ```java ProcessInstance instance = runtimeService.startProcessInstanceByKey( "leaveProcess", "DRAFT_20230901_001" // 业务键包含草稿标识 ); ``` 2. **状态同步机制** 使用执行监听器同步业务系统状态: ```xml <userTask id="draftTask"> <extensionElements> <activiti:executionListener event="start" class="com.example.DraftStatusListener"/> </extensionElements> </userTask> ``` - 监听器中调用业务服务更新草稿状态[^1] --- #### 四、状态判断对比表 | 判断维度 | 技术实现 | 优点 | 缺点 | |----------------|----------------------------|-----------------------|---------------------| | 任务生命周期 | `createTime`与`lastUpdateTime`对比 | 无需额外变量 | 无法区分主动保存草稿 | | 流程变量 | `isDraft`布尔标记 | 精确控制 | 需维护变量一致性 | | 业务键规则 | 业务键包含状态标识 | 与业务系统天然结合 | 需要解析业务键逻辑 | | 表单数据检测 | 必填字段验证 | 自动检测数据完整性 | 无法处理非表单任务 | --- #### 五、典型代码示例 ```java // 综合判断草稿状态 public boolean isTaskDraft(String taskId) { Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); // 条件1: 存在未完成的任务 boolean condition1 = (task != null); // 条件2: 存在草稿标记变量 boolean condition2 = taskService.hasVariable(taskId, "isDraft") && (Boolean) taskService.getVariable(taskId, "isDraft"); // 条件3: 属于草稿节点 boolean condition3 = "draftTask".equals(task.getTaskDefinitionKey()); return condition1 && (condition2 || condition3); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值