技术背景: 

作者使用西门子低代码 Studio pro 最近在做一个项目时,收获了一个比较基础的开发小技巧,有些代码逻辑,需要处理多种类型的Entity Object or Entity List 或者其他类型(String)。因此此时 我们最先想到的做法不是针对每个Entity Object逐一编写相应的Java Action,应该是整理这些需求的逻辑梳理为一个所有Entity都通用的Java Action。

业务价值

  1. 灵活覆盖及实现业务需求,及业务拓展
  2. 功能模块组件化,可在多个项目中复用,解决类似或相同的业务问题
  3. 可作为公司技术资产,组件公司独立的技术组件库

技术价值

  1. 降低代码耦合,为开发者提供更加广阔的开发视野
  2. 提高代码结构化,实现一码多用
  3. 提高项目结构化,打造符合软件工程理论的低耦合,易维护,可扩展的企业级软件应用

基础知识介绍:

在JDK(Java Development Kit)1.5加入了泛型;

泛型,即“参数化类型”。就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

例如:GenericClass<T>{}

需要详细学习的小伙伴大家可以去 看一下《Java 编程思想》这本书

同时,这里给出一个参考学习Java基础的学习链接:java 泛型全解 - 绝对最详细 - 云+社区 - 腾讯云 (tencent.com)

西门子低代码平台(西门子低代码 Studio Pro)中的泛型

各位读者,阅读到这里,详细大家已经知道泛型是什么,以及能帮助我们在开发过程中做什么事情。若还没有理解这个概念,及实际意义。请先学习了解!

这里有几个基础给概念词汇我根据我的理解给大家解读一下(若不对请留言,我会改正):

  1. Java Action: 在西门子低代码 Studio Pro 中,提供给开发者写复杂Java代码逻辑的.java文件。
  2. MicroFlow: 西门子低代码 Studio Pro 中通过拖拉拽,图形化开发后台逻辑的逻辑流,这里简称微流。
  3. Java Action Call: 可以在MicroFlow中使用拖拽,并选择调用已经创建完成的Java Action。

首先我们要创建一个Java Action在西门子低代码 Studio Pro 中。

右键点击 任意一个自定义的Module 模块 按照图示创建Java Action

输入名称-这里叫Remove_Duplicate_Elements  Java Action

双击选择 刚刚创建的Remove_Duplicate_Elements的Java Action。

选择上方的Type Parameters,创建一个type parameter 输入名称为EntityToJoin(可自定义)。

创建输入Java Action 的参数,使用Type Paremeters中定义的类型。

小编这里创建了3个参数,

名称    | 类型

Entity  |(EntitytoJoin)

OElist  | EntitytoJoinList

FromPropertiesName | String

小编这里由于输出永远是去重的String的List 所以这里统一创建了一个结果Entity,就是这个ValueObject。

*如果大家输出的Entity也是不固定的话,也可以创建一个Type Parameters 作为输出类型选择,并且在输入参数,添加结果Entity选择

在本次开发主要使用了西门子低代码 Runtime提供的Java API(Mendix API

Object.getMember()用来根据对象获得他的属性,下面我填入的参数FromPropertiesName是与Object内想对应的属性名称,这样他就可以匹配到需要的属性,我们紧接着用getValue方法获取属性值并转换为String类型。

Core.instantiate() 是用来创建一个IMendixObject泛型下的实体对象,这个代码例子简单来讲就是创建一个这里是ValueObject 类型的Object。

Object.getMember(getContext(), FromPropertiesName).getValue(getContext()).toString()

IMendixObject vo= Core.instantiate(getContext(), ValueObject.getType());

若对Java Action 源码理解有问题:这里提供几个地址供大家学习

​​​​​​Build Microflow Actions| Mendix Documentation (着重参考,2 Creating Generic Action Using Type Parameters)。

Use the Java API | Mendix Documentation(教大家如何使用 Mendix Runtime提供的Java API)

详细细节大家可以看一下这个源码实现。

// This file was generated by Mendix Studio Pro.

//

// WARNING: Only the following code will be retained when actions are regenerated:

// - the import list

// - the code between BEGIN USER CODE and END USER CODE

// - the code between BEGIN EXTRA CODE and END EXTRA CODE

// Other code you write will be lost the next time you deploy the project.

// Special characters, e.g., é, ö, à, etc. are supported in comments.

package dataanalysismodule.actions;

import java.util.*;

import java.util.stream.Collectors;

import com.mendix.core.Core;

import com.mendix.systemwideinterfaces.core.IContext;

import com.mendix.webui.CustomJavaAction;

import dataanalysismodule.proxies.ValueObject;

import com.mendix.systemwideinterfaces.core.IMendixObject;

public class Remove_Duplicate_Elements extends CustomJavaAction<java.util.List<IMendixObject>>

{

private java.lang.String Entity;

private java.util.List<IMendixObject> OEList;

private java.lang.String FromPropertiesName;

public Remove_Duplicate_Elements(IContext context, java.lang.String Entity, java.util.List<IMendixObject> OEList, java.lang.String FromPropertiesName)

{

super(context);

this.Entity = Entity;

this.OEList = OEList;

this.FromPropertiesName = FromPropertiesName;

}

@java.lang.Override

public java.util.List<IMendixObject> executeAction() throws Exception

{

// BEGIN USER CODE

//判断是否为空

        if(OEList.isEmpty())

        {

         return null;

        }

        //可以用Collection Lambda哈,这里用了最笨的方式做的

        List <String> rowlist=new ArrayList<>();

        for(IMendixObject i : OEList)

      {

      if( i.getMember(getContext(), FromPropertiesName).getValue(getContext())!= null)

       rowlist.add(i.getMember(getContext(), FromPropertiesName).getValue(getContext()).toString());

      }

        //处理并获得去重结果

        List <String> resultlist = removeDuplicationByTreeSet(rowlist);

        

        //将结果输入数据

        List<IMendixObject> voList = new ArrayList<>();

      for(String i : resultlist)

      {

       IMendixObject vo= Core.instantiate(getContext(), ValueObject.getType());

       vo.setValue(getContext(), ValueObject.MemberNames.IStringValue.toString(), i);

       voList.add(vo);

      }

return voList;

// END USER CODE

}

/**

 * Returns a string representation of this action

 */

@java.lang.Override

public java.lang.String toString()

{

return "Remove_Duplicate_Elements";

}

// BEGIN EXTRA CODE

/**使用TreeSet实现List去重(有序)

   *

   * @param list

   * */

  public static List <String> removeDuplicationByTreeSet(List<String> OHlist) {

  

  List<String> list= new ArrayList<>();

  for(String oh:OHlist) {

  if(oh!= null && !oh.trim().equals(""))

  {

  list.add(oh);

  }

  

  }

  Set<String> Aset = new TreeSet<String>();

        //这里要注意当orderList集合大小只有1的时候其实没必要去重,就一个元素还去啥重

        //注意点2,虽然比较器中 = 0的会被判定相同,但是Set在去重的时候会按照 orderList 中元素的顺序来去重,可能最后拿到的不是你想要的结果,这里要慎重.比如说我们想要 orderList 去重后 quantity最大的那个元素,但是orderList中 quantity 最小的元素排在第一位,那么后面再根据 自定义的compare比较的时候会把后面我们要的quantity最大的那个元素丢弃掉

        //建议只用于去重,不要同时去重和修改数据

  Aset.addAll(list);

      //把List集合所有元素清空

      list.clear();

      list.addAll(Aset);

      return list;

  }

// END EXTRA CODE

}

关于Mendix公司

在一个数字化先行的世界中,客户希望自己的每一项需求都得到满足,员工希望使用更好的工具来完成工作,而企业意识到自己只有通过全面数字化转型才能生存并取得成功。Mendix公司,a Siemens business正在迅速成为企业数字化转型的推动者。其业内领先的低代码平台和全方位的生态系统整合最先进的技术,帮助企业创造出提高互动性、简化操作和克服IT瓶颈的解决方案。Mendix公司以抽象化、自动化、云和协作为四大支柱,大幅提升开发者的生产力,并且依靠自己的工程协作能力和直观的可视化界面,帮助大量不熟悉技术的“公民”开发者在他们所擅长的领域创建应用程序。Mendix公司是权威行业分析师眼中的领导者和远见者,也是一个云原生、开放、可扩展、敏捷和饱经考验的平台。从人工智能和增强现实,到智能自动化和原生移动,Mendix公司已成为数字化先行企业的骨干。Mendix公司企业低代码平台已被全球4000多家领先的公司采用。

感谢阅读!

更多推荐