概述
dart:core 库提供了一个少量但是重要的内置功能集合。 该库会被自动导入每个 Dart 程序。
包括:内置类型,集合和其他核心功能。
控制台打印
顶级 print()
方法接受一个参数 任意对象) 并输出显示这个对象的字符串值(由 toString()
返回) 到控制台。
var name = "xiaoyu";
print('My name is $name.');
通过 $
可以在字符串中引入变量名。
数字
相关内容:
📃 数据类型
参考:数字
字符串
相关内容:
📃 数据类型
StringBuffer
要以代码方式生成字符串,可以使用 StringBuffer 。 在调用 toString()
之前, StringBuffer 不会生成新字符串对象。 writeAll()
的第二个参数为可选参数,用来指定分隔符, 下例中使用空格作为分隔符。
var sb = StringBuffer();
sb
..write('Use a StringBuffer for ')
..writeAll(['efficient', 'string', 'creation'], ' ')
..write('.');
var fullString = sb.toString();
print(fullString); // Use a StringBuffer for efficient string creation.
正则表达式
RegExp类提供与JavaScript正则表达式相同的功能。 使用正则表达式可以对字符串进行高效搜索和模式匹配。
// 下面正则表达式用于匹配一个或多个数字。
var numbers = RegExp(r'\d+');
var allCharacters = 'llamas live fifteen to twenty years';
var someDigits = 'llamas live 15 to 20 years';
// contains() 能够使用正则表达式。
print(allCharacters.contains(numbers)); // false
print(someDigits.contains(numbers)); // true
// 替换所有匹配对象为另一个字符串。
var exedOut = someDigits.replaceAll(numbers, 'XX');
print(exedOut); // llamas live XX to XX years
直接使用正则表达式中的某些方法(hasMatch、allMatches):
var numbers = RegExp(r'\d+');
var someDigits = 'llamas live 15 to 20 years';
// 检查正则表达式是否在字符串中匹配到对象。
print(numbers.hasMatch(someDigits)); // true
// 迭代所有匹配对象
for (var match in numbers.allMatches(someDigits)) {
print(match.group(0)); // 15, then 20
}
参考:字符和正则表达式
URI
Uri 类 提供对字符串的编解码操作。 这些函数用来处理 URI 特有的字符,例如 &
和 =
。 Uri 类还可以解析和处理 URI—host,port,scheme等组件。
编码和解码
使用 encodeFull()
和 decodeFull()
方法, 对 URI 中除了特殊字符(例如 /
, :
, &
, #
)以外的字符进行编解码, 这些方法非常适合编解码完整合法的 URI,并保留 URI 中的特殊字符。
var uri = 'http://example.org/api?foo=some message';
var encoded = Uri.encodeFull(uri); // http://example.org/api?foo=some%20message
print(encoded);
var decoded = Uri.decodeFull(encoded);
print(uri == decoded); // true
使用 encodeComponent()
和 decodeComponent()
方法, 对 URI 中具有特殊含义的所有字符串字符,特殊字符包括(但不限于)/
, &
, 和 :
。
var uri = 'http://example.org/api?foo=some message';
var encoded = Uri.encodeComponent(uri);
print(encoded); // http%3A%2F%2Fexample.org%2Fapi%3Ffoo%3Dsome%20message
var decoded = Uri.decodeComponent(encoded);
print(uri == decoded); // true
解析URI
使用 Uri 对象的字段(例如 path
), 来获取一个 Uri 对象或者 URI 字符串的一部分。 使用 parse()
静态方法,可以使用字符串创建 Uri 对象。
var uri = Uri.parse('http://example.org:8080/foo/bar#frag');
print(uri.scheme); // http
print(uri.host); // example.org
print(uri.path); // /foo/bar
print(uri.fragment); // frag
print(uri.origin); // http://example.org:8080
构建URI
使用 Uri()
构造函数,可以将各组件部分构建成 URI 。
var uri = Uri(scheme: 'http', host: 'example.org', path: '/foo/bar', fragment: 'frag');
assert(uri.toString() == 'http://example.org/foo/bar#frag');
参考:URI
DateTime和Duration
创建日期时间对象
// 获取当前时刻。
var now = DateTime.now();
print(now); // 2020-12-17 16:28:20.650318
// 根据本地时区创建 DateTime 对象。
var y2k = DateTime(2000);
print(y2k); // 2000-01-01 00:00:00.000
// 指定年月日。
y2k = DateTime(2000, 1, 2);
print(y2k); // 2000-01-02 00:00:00.000
// 将日期指定为 UTC 时区。
y2k = DateTime.utc(2000);
print(y2k); // 2000-01-01 00:00:00.000Z
// 指定自Unix纪元以来,以毫秒为单位的日期和时间。
y2k = DateTime.fromMillisecondsSinceEpoch(946684800000, isUtc: true);
print(y2k); // 2000-01-01 00:00:00.000Z
// 解析ISO 8601日期。
y2k = DateTime.parse('2000-01-01T00:00:00Z');
print(y2k); // 2000-01-01 00:00:00.000Z
日期时间计算
在Dart中的日期时间计算尤其简单,通过简单的 add
和 subtract
结合 Duration
对象即可完成。
var y2k = DateTime.utc(2000);
// 增加一年。
var y2001 = y2k.add(const Duration(days: 366));
print(y2001.year); // 2001
// 减少30天。
var december2000 = y2001.subtract(const Duration(days: 30));
print(december2000.year); // 2000
print(december2000.month); // 12
// 计算两个时刻之间的查,
// 返回 Duration 对象。
var duration = y2001.difference(y2k);
print(duration.inDays); // 366 (y2k was a leap year.)
比较(Comparable)
如果实现了 Comparable 接口, 也就是说可以将该对象与另一个对象进行比较, 通常用于排序。 compareTo()
方法在 小于 时返回 < 0, 在 相等 时返回 0, 在 大于 时返回 > 0。
void main() {
var short = const Line(1);
var long = const Line(100);
print(short.compareTo(long)); // -99
}
class Line implements Comparable<Line> {
final int length;
const Line(this.length);
@override
int compareTo(Line other) => length - other.length;
}
迭代(Iterator)
Iterable][] 和 Iterator 类支持 for-in 循环。 当创建一个类的时候,继承或者实现 Iterable,可以为该类提供用于 for-in 循环的 Iterators。 实现 Iterator 来定义实际的遍历操作。
比如迭代一个很长的字符串,遇到空格则进入下一次迭代,每次返回当前空格前的字符串:
void main() {
const myString = 'This is a long string that I want to iterate over.';
final myIterable = TextRuns(myString);
for (var textRun in myIterable) {
print(textRun);
}
}
class TextRuns extends Iterable<String> {
TextRuns(this.text);
final String text;
@override
Iterator<String> get iterator => TextRunIterator(text);
}
class TextRunIterator implements Iterator<String> {
TextRunIterator(this.text);
final String text;
String _currentTextRun;
int _startIndex = 0;
int _endIndex = 0;
final breakChar = RegExp(' ');
// 当前迭代的元素
@override
String get current => _currentTextRun;
// 下一次迭代
@override
bool moveNext() {
_startIndex = _endIndex;
// 迭代结束(迭代出口:当前文本已遍历完成)
if (_startIndex == text.length) {
_currentTextRun = null;
return false;
}
// 获取下一个迭代元素(遇到空格就返回一次)
final next = text.indexOf(breakChar, _startIndex);
_endIndex = (next != -1) ? next + 1 : text.length;
_currentTextRun = text.substring(_startIndex, _endIndex);
return true;
}
}
输出:
This
is
a
long
string
that
I
want
to
iterate
over.
如果需要在循环中添加循环条件,可以使用 where
:
myIterable
.where((str) => str.length > 3)
.forEach((element) => print(element));
输出:
This
long
string
that
want
iterate
over.