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 bytes = utf8.encode(“Hello”);
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([int length])
new List(5); // 固定长度和类型
new List(5); // 固定长度

3、创建一个 list,每个元素共享相同的值,growable 表示是 list 长度是否可变,默认 false 固定长度
List.filled(int length,E fill, {bool growable: false})
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 list = new ArrayList(Arrays.asList(ipList))


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> arr = line = List.filled(a, List.filled(b, “”))
字符串拼接 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 = void Function(dynamic response);
typedef Exception = void Function(ErrorInfo errorInfo);

class IResponseCallback {
Callback callback;
Exception exception;

IResponseCallback({required this.callback, required this.exception});
}

// 使用
IResponseCallback callback = IResponseCallback(
callback: (response){
},
exception: (errorInfo){
});
时间戳
System.currentTimeMillis()
DateTime.now().millisecond
类型转换 // base64 转 List
base64Url.decode(str)

// String 转 byte
String foo = ‘Hello world’;
List bytes = utf8.encode(foo);

// 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