Java转Dart常用规则
Java | Dart |
---|---|
public、private等作用域关键字 | 没有作用域关键字,直接去掉 成员变量和常量的声明,参考下面两项 |
同名方法重载 | Dart不支持方法重载,同名方法只能有一个,使用可选参数替代 method(var p1, [p2, p3]); method(var p1, {String p2, int p3 = 1}); “[]”包围的参数属于可选位置参数 “{}”包围的参数属于可选命名参数 |
声明成员变量,未赋值情况 String s; |
Dart空安全声明,需要显式声明可能为null的变量,解决办法 1、字段或变量设置默认值,String s = “” 2、将类型更改为可为 null, String? s 3、将其标记为 late【注意:在使用变量之前的后期确保变量稍后必须初始化。否则在使用变量时可能会遇到运行时错误。】 late String s; static late String s; |
声明常量 static final String s; |
const声明的常量必须赋值明确的值; final声明的常量可以在运行时再赋值 static const String s = “”; static final String s; |
boolean | bool |
float、double | 浮点型都用double表示 dart 中没有float类型只有double |
short、int、long | 在dart中都是用 int dart中数值类型只有两种:int和double;整型和浮点型 |
byte数组 byte[] bytes |
dart中的字节流为int数组 List |
HashMap、HashSet、ConcurrentHashMap等集合类 | Dart 集合中原生支持了四种类型:list, map, queue,和 set |
map.put(k, v) | map[k] = v |
int[] a = new int[]{1, 2, 3, 4}; new int[5] |
1、非常常用的字面量创建方式 List a = [1, 2, 3, 4]; 2、创建一个空数组或者 length 长度的数组 List new List new List(5); // 固定长度 3、创建一个 list,每个元素共享相同的值,growable 表示是 list 长度是否可变,默认 false 固定长度 List List a = new List.filled(10, 1); 4、根据 iterable 对象创新一个新数组 List.from(iterable elements,{bool growable:true}) List a = new List.from([1, “2”, 3, 4]); 5、创建一个元素,每个位置创建一个新对象 List.generate(int length, E generator(int index) List a = new List.generate(10, (value) => value + 1); |
List添加集合,把新集合加到最前面 list.addAll(0, otherList); |
使用 spread collections 扩展集合 var y = [4,5,6]; var x = […y,1,2]; |
List 克隆 List |
deep clone of List and Map // clone list List a = [‘x’,’y’, ‘z’]; List b = […a]; // clone map Map mapA = {“a”:”b”}; Map mapB = {…mapA}; |
List 排序 List numList = Arrays.asList(1,2,3); a.sort((num1,num2)->{return num1.compareTo(num2);}); |
1、对整数列表进行排序 List a = [1, 2, 3, 4]; a.sort(); 2、使用compareTo条件排序 var list = [‘two’, ‘three’, ‘four’]; list.sort((a, b) => a.length.compareTo(b.length)); 或者 list.sort((a, b) => a.length - b.length)); |
List删除另外一个集合 list.removeAll(otherList); |
使用List的removeWhere方法替代 list.removeWhere((item) => otherList.contains(item)); |
一维数组 String[] |
使用List替代 List |
二维数组 String[][] 初始化一个二维数组 int a = 10, b = 5; String[][] arr = line = new String[a][b]; |
使用Map替代 List<List 初始化一个二维数组 int a = 10, b = 5; List<List |
字符串拼接 | String txt = “$str $num” $符号后面跟的是变量/表达式 |
StringBuilder sb = new StringBuilder(); sb.append(“ip=”).append(userIp); |
StringBuffer sb = StringBuffer() ..write(“ip=”)..write(userIp); |
for (String ip : ips) | 使用 for-in 循环:for (String ip in ips) 或使用变量的forEach方法 |
判空+赋值 if(obj == null) obj = new Object() |
可以用双问号替代 例如obj ?? {} |
多线程,线程池,同步synchronized等 | 这些在dart里面都没有,需要转变思路理解Dart单线程异步编程思想,使用async、await、Future、isolate等解决 |
try/catch(Exception e) | try/catch(e) try {} on Exception cache(e) {} |
创建匿名内部类对象 new IHttpCallback() { @Override public void callback(HttpData } @Override public void exception(HttpData } }; |
// 定义 typedef Callback typedef Exception = void Function(ErrorInfo errorInfo); class IResponseCallback { Callback callback; Exception exception; IResponseCallback({required this.callback, required this.exception}); } // 使用 IResponseCallback callback = IResponseCallback( callback: }, exception: (errorInfo){ }); |
时间戳 System.currentTimeMillis() |
DateTime.now().millisecond |
类型转换 | // base64 转 List base64Url.decode(str) // String 转 byte String foo = ‘Hello world’; List // byte 转 String String bar = utf8.decode(bytes); // String 转 int String s = “45”; int i = int.parse(s); // int 转 String int j = 45; String t = “$j”; 或 t = j.toString(); // Json String 转 Map Map<String, dynamic> jsonObject = jsonDecode(httpData.data); |
类型判断和强转 object instanceof HashMap (HashMap)object |
object is Map object as Map |
网络判断 | connectivity_plus: ^3.0.2 var connectivityResult = await Connectivity().checkConnectivity(); bool isNetworkAvailable = connectivityResult == ConnectivityResult.mobile || connectivityResult == ConnectivityResult.wifi; |
Pattern/Matcher 正则匹配 —- String code = “SH1001”; String number = Pattern.compile(“[^0-9]”).matcher(code).replaceAll(“”); String zimu = code.replaceAll(“[^a-zA-Z].*$”, “”); System.out.println(“number=”+number + “, zimu=”+zimu); // 输入:number=1001, zimu=SH |
RegExp exp = RegExp(“[1-2]{1}”); bool exp.hasMatch(“”) — String code=”SH1001”; String number = code.replaceAll(RegExp(“[^0-9]”), “”); String zimu = code.replaceAll(RegExp(r”[^a-zA-Z].*$”), “”); print(“number=$number, zimu=$zimu”); // 输入:number=1001, zimu=SH |
16进制转String | String SPLIT_0x01= String.fromCharCode(int.parse(‘0x01’,radix: 16)); |
判断是否相同,复现对象的equals @Override public booleanequals(Object o) { } |
判断是否相同,复现对象的== @override bool operator ==(Object o) { } |
URLEncoder.encode(keyword, “utf-8”) | Uri.encodeComponent(keyword) |
String.format,拼接及字符串补齐 String.format(“%08d”, 123); // 输出 “00000123 “ |
“123”.padLeft(8, “0”); // 左侧补齐0 “123”.padRight(8, “0”); // 右侧补齐0 方案一: 使用 padLeft : print(1.toString().padLeft(3, ‘0’)); // 001 print(12.toString().padLeft(3, ‘0’)); // 012 print(123.toString().padLeft(3, ‘0’)); // 123 print(1234.toString().padLeft(3, ‘0’)); // 1234 方案二: 使用NumberFormat : NumberFormat formatter = NumberFormat(“000”); print(formatter.format(1)); // 001 print(formatter.format(12)); // 012 print(formatter.format(123)); // 123 print(formatter.format(1234)); // 1234 |
Date 日期相关 Date date = new Date(); date.setTime(5400000); |
DateTime DateTime date = DateTime.now(); date = DateTime.fromMillisecondsSinceEpoch(5400000); |
附官方两种对照表:Java to Dart、Swift to Dart