Flutter开发之Dart的数据类型01

手把手教你为ArduPilot添加自定义飞行模式:以自动巡检航线为例 本文详细介绍了如何为开源飞控ArduPilot添加自定义飞行模式,并以自动巡检航线为例,提供了从状态机设计、代码实现到地面站集成的完整开发指南。通过七步法手把手教学,帮助开发者深入理解飞控核心逻辑,实现无人机自主执行复杂巡检任务,满足行业应用定制需求。 阅读详情

dart-logo

Dart数据类型

Dart内置的数据类型中, 支持以下几种数据类型

  • numbers(数字)
  • strings(字符串)
  • booleans(布尔)
  • lists (也被称之为 arrays)
  • maps
  • runes (用于在字符串中表示Unicode字符)
  • symbols

上面的数据类型可以直接使用字面量初始化

var str = 'this is a string' ;
var isStr = true;

也可以使用构造函数初始化, 由于Dart中每个变量引用的都是一个对象 – 一个类的实例, 一些内置的类型具有自己的构造函数

// 可以使用 Map()构造函数来创建一个 map,就像这样 
var map = new Map();

Dart中Numbers支持两种类型的数字:

  • int: 整数值,其取值通常位于-2^53和2^53之间, 差不多9*10^16, 也就是支持16位数字
  • double: 64-bit (双精度) 浮点数,符合IEEE 754标准

int

  • 其取值通常位于-2^53和2^53之间
  • 也就是-9,007,199,254,740,992和9,007,199,254,740,992之间
  • 实际在编译中则是超过19位则会报错
  • 更多可参考问题 1533了解更多信息
// 如下定义则会报错, 定义的int星变量需要在9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808之间
var bil = 12345678901234567890;

一些常用的判断属性

  const m1 = 12;
  
  // 是否为负数, 大于0即为false
  print(m1.isNegative);
  print(0.isNegative);

  // 是否是有限的
  print(b32.isFinite);
  print(m1.isFinite);

  // 是否是无穷大或者无穷小
  print(m1.isInfinite);

  // 是否为偶数
  print(m1.isEven);

  // 是否为奇数
  print(m1.isOdd);

  // 是否是NaN值
  print(m1.isNaN);
  
  // 数据的符号,-1.0:值小于0、+1.0:值大于0、-0.0/0.0/NaN:值是其本身
  print(21.sign);  // 1
  print(-23.sign); // -1
  print(0.sign);   // 0
  print(-0.sign);  // 0

int数字类型中常用的函数

  const m3 = 24;
  
  // 获取绝对值
  print(m3.abs());

  // 转成字符串
  print(m3.toString());

  // 幂次求模; m3的4次幂, 在对3求模
  print(m3.modPow(4, 3)); // 1

  // 返回m3和16的最大公约数
  print(m3.gcd(16));
  
  // 返回m3除以5的余数
  print(m3.remainder(5));

  // 转成double
  print(m3.toDouble());
  
  // 比较大小, 0:相同、1:大于、-1:小于
  print(m3.compareTo(30));

double

下面是定义double的一些方式:

var y = 1.1;
var exponents = 1.42e5;

double类型相关的属性使用

  // 是否是NaN值
  print(d0.isNaN);
  // 是否是无穷大或者无穷小
  print(d0.isInfinite);
  // 是否是有限的
  print(d0.isFinite);
  // 是否为负数, 大于0即为false
  print(d0.isNegative);

  // 根据代码单元生成的哈希码
  print(d0.hashCode);
  
  // 数据的符号,-1.0:值小于0、+1.0:值大于0、-0.0/0.0/NaN:值是其本身
  print(d0.sign);
  print(-1.23.sign);
  print(0.0.sign);

  // 返回运行时的类型
  print(d0.runtimeType);  // double

double类型相关方法的使用

  // 转成字符串
  print(d0.toString());

  // 取整数, 小数点舍去
  print(d0.toInt());

  // 比较大小, 0:相同、1:大于、-1:小于
  print(d0.compareTo(30));

  // 获取绝对值
  print(d0.abs());

  // 四舍五入
  print(d0.round()); // 13
  // 向上取整
  print(d0.ceil());  // 14
  // 向下取整
  print(d0.floor()); // 13

  // 输出的double类型, 相当于d0.round().toDouble()
  print(d0.roundToDouble()); // 13.0
  print(d0.ceilToDouble());  // 14.0
  print(d0.floorToDouble()); // 13.0

  // 保留指定的小数位数(四舍五入), 不足补0, 字符串返回
  print(d0.toStringAsFixed(2)); // 13.10

  // 保留变量的位数(小数点前后的总位数), 不足补0, 多余的四舍五入
  print(d0.toStringAsPrecision(10));  // 13.09870000

  /**  toStringAsExponential
   *     1.toStringAsExponential();       // 1e+0
   *     1.toStringAsExponential(3);      // 1.000e+0
   *     123456.toStringAsExponential();  // 1.23456e+5
   *     123456.toStringAsExponential(3); // 1.235e+5
   *     123.toStringAsExponential(0);    // 1e+2
   */


  /** toStringAsPrecision
   *     1.toStringAsPrecision(2);       // 1.0
   *     1e15.toStringAsPrecision(3);    // 1.00e+15
   *     1234567.toStringAsPrecision(3); // 1.23e+6
   *     1234567.toStringAsPrecision(9); // 1234567.00
   *     12345678901234567890.toStringAsPrecision(20); // 12345678901234567168
   *     12345678901234567890.toStringAsPrecision(14); // 1.2345678901235e+19
   *     0.00000012345.toStringAsPrecision(15); // 1.23450000000000e-7
   *     0.0000012345.toStringAsPrecision(15);  // 0.00000123450000000000
   */

Booleans

  • 为了代表布尔值,Dart有一个名字为bool的类型。
  • 只有两个对象是布尔类型的:true和 false 所创建的对象, 这两个对象也都是编译时常量
  • 当Dart需要一个布尔值的时候,只有true对象才被认为是true, 所有其他的值都是flase; 像 1、 "aString"、 以及someObject等值都被认为是false
  const m = 1;
  if (m) {
    print('是一个布尔值');
  } else {
    print('不是一个布尔值');
  }
  • 在Dart中上面判断语句是合法的代码
  • 但是在Dart检查模式运行,上面的代码将会抛出一个异常,表示m变量不是一个布尔值
  • 所以不建议这么使用上述方法进行判断

Strings

Dart字符串是UTF-16编码的字符序列, 可以使用单引号或者双引号来创建字符串:

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
// 单引号里面有单引号(双引号里面有双引号)时, 必须使用反斜\杠转义
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";

字符串的拼接

直接把相邻字符串写在一起,就可以连接字符串了

var string = 'name''+''age'

用+把相邻字符串连接起来

var string1 = 'name' + '+' + 'age';

引用变量

  • 在Dart中使用$符号引用变量或者表达式
  • 表达式引用方式: ${表达式}, 如果表达式是一个变量则{}可以省略
  const num1 = 12;
  // 引用表达式
  const ageStr0 = 'age = $num1';
  const ageStr1 = 'age = ${num1} is my age';
  // 引用表达式
  const ageStr2 = 'age = ${num1 * num1}';

多行字符串

使用单引号或双引号的三引号

  const line1 = '''
      道路千万条,安全第一条,
      行车不规范,亲人两行泪
    ''';
  const line2 = """
      道路千万条,安全第一条,
      行车不规范,亲人两行泪
    """;

转义符号

声明raw字符串(前缀为r),在字符串前加字符r,或者在\前面再加一个\,可以避免\的转义作用,在正则表达式里特别有用

  // 转义字符
  print(r'转义字符, \n');
  print('转义字符, \\n');
  print('转义字符, \n');

属性介绍

  const string0 = 'https://www.titanjun.top/';
  
  // 可根据索引获取字符串的每一个字符
  print(string0[1]);

  // 字符串是否是空的
  print(string0.isEmpty);
  print(''.isEmpty); // true
  // 字符串是否不是空的
  print(string0.isNotEmpty);
  print(''.isNotEmpty);  // false

  // 返回字符串Unicode代码的可迭代对象
  print(string0.runes);
  // 返回字符串的UTF-16代码单元列表
  print(string0.codeUnits);
  // 返回根据代码单元生成的哈希码
  print(string0.hashCode);
  // 字符串的长度
  print(string0.length); 
  // 返回对象运行时的类型
  print(string0.runtimeType);  // String

方法介绍

  const string0 = 'https://www.titanjun.top/';
  
  // 字符串比较
  print('titan'.compareTo('jun'));
  
  // 大小写转换
  print(string0.toUpperCase());
  print(string0.toLowerCase());

  // 截取字符串(开头索引和结尾索引)
  print(string0.substring(0, 5)); // https
  // 只有开头索引, 默认截取到最后
  print(string0.substring(12));  // titanjun.top/

  // 拆分字符串
  print(string0.split('.'));  // [https://www, titanjun, top/]
  print(string0.split(new RegExp(r"t")));  // [h, , ps://www., i, anjun., op/]

  // 去掉字符串里面的tab空格和换行符
  const string1 = '\t\ttitanjun top\n';
  print(string1.trim());
  // 去掉字符串开头的tab空格和换行符
  print(string1.trimLeft());
  // 去掉字符串结尾的tab空格和换行符
  print(string1.trimRight());
endsWith

判断字符串是否以某字符(字符串)结尾, 参数不接受正则表达式

  const str1 = 'titanjun.top';
  print(str1.endsWith('p'));  //true
  print(str1.endsWith('/'));  //false
  print(str1.endsWith('top'));  //true
startsWith
bool startsWith(Pattern pattern, [int index = 0]);

判断字符串是否以某字符(字符串)开头, 参数接受正则表达式

  const str1 = 'titanjun.top';
  print(str1.startsWith('h'));  //false
  print(str1.startsWith('tit')); //true
  print(str1.startsWith('it', 1)); //true
  print(str1.startsWith(new RegExp(r'[A-Z][a-z]'), 1)); //false
indexOf
int indexOf(Pattern pattern, [int start]);
  • 根据指定的字符(字符串)获取其在原字符串中第一次出现的索引值, 顺序是从左到右
  • 可以从指定的索引初开始, 默认从0开始
  • 如果原字符串中没有需要查找的字符(字符串), 则返回值为: -1
  const str2 = 'https://www.titanjun.top/';
  print(str2.indexOf('titan')); // 12
  print(str2.indexOf('t', 5));  // 12
  print(str2.indexOf(new RegExp(r'[a-z]'))); //0
  // 如果没有改字符, 则会输出-1
  print(str2.indexOf('ppp'));  // -1
lastIndexOf
int lastIndexOf(Pattern pattern, [int start]);

效果和indexOf一样, 不同点则是: indexOf的顺序是从左到右, lastIndexOf是从右到左

  const str2 = 'https://www.titanjun.top/';
  print(str2.lastIndexOf('t', 20));  //14
  print(str2.indexOf(new RegExp(r'[a-z]'))); //0
  // 如果没有改字符, 则会输出-1
  print(str2.indexOf('ppp'));  // -1
补占位符
String padLeft(int width, [String padding = ' ']);
String padRight(int width, [String padding = ' ']);
  • 在字符串前后补占位符
  • 参数一: 想要得到的字符串的位数
  • 参数二: 位数不足时, 补充的字符
  const str3 = '12';
  print(str3.padLeft(2, '0')); //12
  print(str3.padRight(3, '0')); // 120
contains
bool contains(Pattern other, [int startIndex = 0]);
  • 判断字符串中是否包含某字符
  • 判断指定索引处的字符是否是某字符
bool contains(Pattern other, [int startIndex = 0]);

const str = 'Dart strings';
print(str.contains('D'));
print(str.contains(new RegExp(r'[A-Z]')));
print(str.contains('D', 0));
print(str.contains(new RegExp(r'[A-Z]'), 0));
替换字符
// 只能替换一次, 参数三为开始的索引值, 默认0
String replaceFirst(Pattern from, String to, [int startIndex = 0]);

// 替换所有符合条件的字符(字符串)
String replaceAll(Pattern from, String replace);

// 替换某一区间的字符
String replaceRange(int start, int end, String replacement);

// 示例如下:
// 替换字符串
  const str4 = 'titanjun12--0123';
  print(str4.replaceFirst('t', 'T'));  // Titanjun12--0123
  print(str4.replaceFirst('12', '21', 10));   //titanjun12--0213

  // 全部替换
  print(str4.replaceAll('12', '21'));  //titanjun21--0213
  print(str4.replaceAll('t', 'T'));  //TiTanjun12--0123

  // 区间替换
  print(str4.replaceRange(0, 5, 'top'));  //topjun12--0123

List

在Dart中List对象就是其他语言中的数组

创建数组

// 创建一个指定长度的List, 不能添加/删除元素
List([int length]);

//通过指定长度创建一个固定长度的List,并使用fill初始化每个位置的值, 不能添加/删除元素
List.filled(int length, E fill, {bool growable: false});

//创建一个包含所有elements的List, 
//当growable为true(默认)时,构造函数返回一个可增长的List。 否则,它返回一个固定长度的List
List.from(Iterable elements, {bool growable: true})

//生成一个包含所有值的List
//除非growable为true(默认),否则创建的List是固定长度的
List.generate(int length, E generator(int index), {bool growable: true})

//创建一个包含所有elements的,不能改变它的长度或元素
List.unmodifiable(Iterable elements)
List
  • 如果设置了参数length(length不能为负数或null),那么创建的List是固定长度的
  • 元素可修改, 元素个数不可修改, 不能删除和增加元素
var l1 = new List(3);  //[null, null, null]
print(l1.length);  //3

// 下面这种写法会报错
l1.length = 1;

如果未设置参数length,那么List的长度是0,并且是可增长的

// 这两种方式一样
var l10 = new List();
var l11 = [];

// 都是可行的
l10.length = 3;
l10.add(1);

当使用指定长度创建一个可增长的List时,仅仅在刚创建后分配长度

List growableList = new List()..length = 500;
filled
  • 通过指定长度创建一个固定长度的List,并初始化每个位置的值
  • 所有的元素都是相同的fill值。 如果指定的值是一个可变对象,那么List中所有的元素都是相同的对象,并且是可修改的
  var l2 = new List.filled(3, 'l');  //[l, l, l]
  var l3 = new List.filled(2, []);   // [[], []]
  l3[0].add(12);   
  print(l3);      // [[12], [12]]
from
  • 创建一个包含所有elements的List
  • elements的Iterator规定了元素的顺序。
  • 当growable为true(默认)时,构造函数返回一个可增长的List。 否则,它返回一个固定长度的List
var l5 = new List.from([1, 2, 3, 4]);
l5.add(5);
print(l5);   // [1, 2, 3, 4, 5]

// 下面的add方法会报错
var l5 = new List.from([1, 2, 3, 4], growable: false);
l5.add(5);
generate
  • 生成一个包含所有值的List, 根据索引值创建元素
  • growable为false时,创建的List是固定长度的
var l4 = new List.generate(3, (int i) => i * i);
l4.add(14);
print(l4);
// [0, 1, 4, 14]
unmodifiable
  • 创建一个包含所有elements的,不可修改的List
  • 不可修改的List不能改变它的长度或元素
  • 如果元素本身是不可改变的,那么由此产生的List也是不可改变的
var l6 = new List.unmodifiable([1, 2, 3, 4]);

List属性

  var arr1 = [1, 2, 3, 4];
  // 数组的第一个和最后一个元素
  print(arr1.first);  // 1
  print(arr1.last);   // 4

  // 判断数组是否为空
  print(arr1.isNotEmpty);  // true
  print(arr1.isEmpty);     // false

  // 数组长度, 元素个数
  print(arr1.length);  // 4

  // 倒序返回List
  print(arr1.reversed);  // [4, 3, 2, 1]

  // 返回Iterator,被允许迭代Iterable的所有元素
  print(arr1.iterator);

  // 对象的运行时类型
  print(arr1.runtimeType);   // List<int>

  // 获取对象的哈希值
  print(arr1.hashCode);
  
  // 根据索引获取元素
  print(arr1[2]);

  // 根据索引修改元素
  arr1[1] = 11;
  print(arr1);

List方法

增加
  // 添加元素
  arr1.add(5);

  // 添加一个数组
  arr1.addAll([10, 12]);
查找
  var arr2 = ['one', 'two', 'three', 'one', 'four'];

  // 是否包含某元素
  print(arr2.contains('one'));  // true
  // 判断数组是否有满足条件的元素
  print(arr2.any((item) => item.length > 4));  // true
  // 判断数组是否所有元素都满足条件
  print(arr2.every((item) => item.length > 4));  // false
  
  // 转化为Map类型, 索引作为Key值,对应的元素作为Value
  print(arr2.asMap());  // {0: one, 1: two, 2: three, 3: one, 4: four}
  
  //随机打乱List中的元素
  arr2.shuffle();

  // 通过索引获取元素, 等价于arr2[3]
  print(arr2.elementAt(3));

  // 获取元素对应的索引值, 默认从索引0开始
  print(arr2.indexOf('one'));  // 0
  // 从第2个索引开始查找
  print(arr2.indexOf('one', 2));  // 3
  // 如果找不到, 返回-1
  print(arr2.indexOf('five'));  // -1

  // 获取元素对应的索引值, 从后往前找
  print(arr2.lastIndexOf('one'));
  print(arr2.lastIndexOf('one', 3));
  print(arr2.lastIndexOf('five'));
  
  // 返回满足条件的第一个元素
  print(arr3.firstWhere((item) => item == 'one'));
  
  // 查找符合条件的元素, 如果有且仅有一个符合条件的元素, 则返回该元素
  // 如果没有匹配到元素,或匹配到多个元素, 则会抛出异常
  print(arr2.singleWhere((item) => item.length == 5));  //three
  
  // 返回除了最初的count个元素外的所有元素
  arr2 = ['one', 'two', 'three', 'four'];
  print(arr2.skip(2)); // (three, four)

  // 返回所有不符合该条件的元素
  print(arr2.skipWhile((item) => item.length == 3));  //(three, four)

  // 返回一个新的List,包含从start(包括)到end(不包括)的对象, 原数组不变
  print(arr2.sublist(1, 3));
  // 不指定end, 默认到数组结尾
  print(arr2.sublist(2));
  
  // 获取某一区间的元素, 返回一个数组
  print(arr2.getRange(1, 3));    // ['two', 'three']
  
  // 数组拼接成字符串
  print(arr2.join());  //onetwothreefour
  print(arr2.join('-'));  //one-two-three-four

  // 返回数组最初的count个元素
  print(arr2.take(2));
  // 返回数组符合条件的元素, 直到条件值为false停止过滤
  arr2 = ['one', 'two', 'three', 'four', 'ten'];
  print(arr2.takeWhile((item) => item.length == 3));  //(one, two)
删除
  var arr2 = ['one', 'two', 'three', 'one', 'four'];
  
  // 删除指定的元素
  // 如果有该元素, 返回true
  print(arr2.remove('two'));  // true
  print(arr2);   // [one, three, one, four]
  // 如果没有该元素, 返回false
  print(arr2.remove('five'));  // false

  // 根据索引删除, 返回被删除的元素值
  print(arr2.removeAt(1));  // three
  print(arr2);   // [one, one, four]

  // 删除最后一个元素, 返回该元素值
  print(arr2.removeLast());  // four
  print(arr2); // [one, one]

  // 删除一个区间的元素, 含左不含右[start, end)
  arr2.addAll(['six', 'seven', 'eight']);
  arr2.removeRange(1, 3);
  print(arr2);  // [one, seven, eight]

  // 删除所有符合条件的元素
  arr2.removeWhere((item) => item.length == 3);
  print(arr2);  // [seven, eight]
  
  //删除List中所有不满足条件的元素
  arr2.retainWhere((item) => item.length > 3);
  print(arr2);
  
  // 删除所有的元素
  arr1.clear();
  print(arr1);  // []
插入
  var arr3 = [1, 3, 4];
  // 在某处插入元素
  arr3.insert(1, 10);
  print(arr3); //[1, 10, 3, 4]

  // 插入一个数组
  arr3.insertAll(2, [12, 32]);
  print(arr3);
重要方法
//过滤
Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test);

// 映射
Iterable<T> map<T>(T f(E e)) => new MappedIterable<E, T>(this, f);

// 排序
void sort([int compare(E a, E b)]);

// 迭代计算, initialValue: 初始值, combine: 计算函数
T fold<T>(T initialValue, T combine(T previousValue, E element))

// 迭代计算, 初始值即为第一个元素的值, combine: 计算函数
E reduce(E combine(E value, E element))

// 对集合的每个元素,按迭代顺序执行函数操作
void forEach(void f(E element))

// 将Iterable的每个元素扩展为0个或多个元素
Iterable expand(Iterable f(E element))

下面看一下每一个函数的具体使用和介绍

  var arr2 = ['one', 'two', 'three', 'four'];
  
  // 过滤操作, 返回所有符合条件的元素
  print(arr2.where((item) => item.length == 3));  //(one, two, ten)
  
  // 映射一个新的数组, 参数是一个函数
  var array = arr2.map((item) {
    return item + '-';
  });
  print(array.toList());  // [one-, ten-, two-, four-, three-]
  
  // 排序, 默认从小到大
  arr2.sort();
  print(arr2);  //[four, one, ten, three, two]
  // 设置条件进行排序
  arr2.sort((item1, item2) {
    // 如果两个比较的结果为0, 那么排序后返回的结果可能不同
    return item1.length.compareTo(item2.length);
  });
  print(arr2);  //[one, ten, two, four, three]

  // 迭代计算, initialValue: 初始值, combine: 计算函数
  var arr4 = [1, 2, 3, 4];
  // 设置初始值
  var result1 = arr4.fold(10, (prev, value) => prev + value);  //20
  var result2 = arr4.fold(2, (prev, value) => prev * value);  //48
  // 初始值即为第一个元素的值, 可迭代对象至少要有一个元素。 如果它只有一个元素,则元素直接返回
  var result3 = arr4.reduce((value, element) => value * element);  // 24

  // 对每一个元素进行操作
  arr2.forEach((item) {
    print(item);
  });
  
  // expand, 以对每个元素调用f函数后生成的元素,按迭代的顺序,返回新的Iterable
  var pairs = [[1, 2], [3, 4]];
  var flattened = pairs.expand((pair) => pair).toList();
  print(flattened); // => [1, 2, 3, 4];

  var input = [1, 2, 3];
  var duplicated = input.expand((i) => [i, i]).toList();
  print(duplicated); // => [1, 1, 2, 2, 3, 3]

由于篇幅太长了, 剩下的一些数据类型下篇文章在继续研究记录吧

参考文献


手把手教你学Simulink——基于Simulink的多轮PMSM同步驱动交叉耦合控制 摘要:本文针对多轮PMSM同步驱动系统的负载不均、参数差异等问题,提出基于Simulink的交叉耦合控制解决方案。通过实时补偿轮间同步误差,实现同步误差<1%、转矩脉动<5%的性能提升。文章详细介绍了系统架构、核心算法(包括PMSM数学模型和偏差耦合控制算法)、Simulink建模步骤及参数设置,并通过仿真验证了稳态和动态性能。同时提供了工程调试建议和完整代码实现,为多轮驱动系统开发提供实用参考。该方案计算量小,可移植性强,适用于电动汽车、AGV等应用场景。 阅读详情

相关推荐

从原理到调试:手把手教你用Matlab解码互补格雷码与相移码(附数据与常见错误排查)

本文详细介绍了如何使用Matlab解码互补格雷码与相移码,涵盖从原理到调试的全过程。通过实际案例和代码示例,帮助读者掌握结构光三维重建中的相位解包裹技术,并提供了常见错误排查与优化建议,提升解码效率与准确性。

weixin_29090917的博客 218

【Dart语言第2篇】内置类型数字

Dart number类型的属性和方法总结

houwhu的博客 2122

哨兵2植被参数反演避坑指南:SNAP中10m/20m分辨率选择与缺失波段处理

本文深入解析了使用SNAP软件进行哨兵2号植被参数反演时的关键操作与决策。核心在于理解SNAP生物物理处理器NNET10m与NNET20m的架构差异,根据是否需要反演冠层叶绿素含量(Cab)等参数,明智选择10米或20米分辨率工作流。文章详细指导了大气校正、波段重采样及处理L2A数据中B01波段“缺失”等常见问题的解决方案,为生态监测与精准农业应用提供清晰的避坑指南和完整实战流程。

wdx01234567的博客 261

Dart数组常用方法

一、数组的定义 1、定义固定类型数组 // 定义固定类型的数组 var list = List<int>(); print('$list - length: ${list.length}'); // 输出 [] - 0 复制代码 2、定义固定长度数组 var list2 = List(2); print('$list2'); // [null, null] 复制代码 3、定义混合类型数组 var list3 = List<dynamic>(); list3.a

大灰狼的小绵羊哥哥的博客 7176

simulink的电动汽车制动系统热管理仿真

本文系统研究了电动汽车制动系统热管理仿真技术。通过建立机电液多物理场耦合模型,分析了不同工况下的动态热平衡特性。提出基于MPC的动态调节和NSGA-II多目标优化算法,使电池温度波动降低60%。创新性采用石墨烯相变材料与微通道液冷复合技术,冷却系统能耗减少40%。研究构建了完整的工程验证平台,涵盖200kW电制动测试台和高精度热成像系统。展望指出,未来将结合Transformer预测和强化学习算法,进一步优化热管理策略。该研究为电动汽车制动系统热管理提供了从理论建模到工程实施的完整解决方案。

xiaoheshang_123的博客 121

基于Python的京东商品价格监控与降价提醒系统设计与实现

本文详细介绍了如何使用Python构建一个完整的京东商品价格监控与降价提醒系统。系统通过爬虫技术实时抓取京东商品价格信息,结合数据存储与分析,实现价格波动监控和智能降价提醒功能。文章涵盖了系统设计、技术选型、代码实现以及部署方案,为电子商务价格监控领域提供了一个实用的解决方案。关键词:Python爬虫、京东API、价格监控、降价提醒、自动化。

2201_76125261的博客 404

Dart内置类型List

目录 1.构造函数 2.属性 3.方法 4.运算符 5.静态方法 1.构造函数 List<E>([intlength]) // length设置之后,list长度固定不可修改,反之如果不设置,可以修改list length属性 // 设置list 类型后,赋值时会做校验 List fixedLengthListType = new List<...

蚂蚁搬砖 3502

由ip地址和子网掩码求网络号、主机号、广播地址(超详细)

1、用二进制数表示IP地址   在进行计算之前,我们首先要学会十进制的IP地址怎么转换为二进制的IP地址。   给出一个例子: 十进制:172.16.25.3 二进制:10101100.00010000.00011001.00000011 1、如果两台主机的网络号相同,我们就说它们是同一网段 2、主机号的意义 - 1)主机号部分全变成1,即为该网段的广播地址 - 2)主机号部分全变成0,即为该网段的网路地址(网络号) 3、如果主机号部分为x位,则该网络能容纳最大主机数为: 2的x次方-2。减2

爱吃雪糕的小布丁的博客 9万+

Dart个人学习笔记(上)

Dart教程 一、Dart简介 入口方法介绍 //这是一个简单的main方法 main(){ } //表示main方法没有返回值 void main(){ } 注释方法 //ss /* ss */ ///ss 变量 dart是一个强大的脚本类型语言,可以不预先定义变量类型,自动会类型推导 可以通过var关键字声明变量 也可以用类型关键词声明,如: var str = 'this is a var'; Srting str2 = 'this is a var'; int num3

xsepower的博客 337

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 940

QPrintPreviewDialog 打印预览使用实例

qt打印机预览实用demo

啊渊的专栏 3677

Flutter开发之Dart的数据类型01(1)

/ 可根据索引获取字符串的每一个字符// 字符串是否是空的// true// 字符串是否不是空的// false// 返回字符串Unicode代码的可迭代对象// 返回字符串的UTF-16代码单元列表// 返回根据代码单元生成的哈希码// 字符串的长度// 返回对象运行时的类型// String// 字符串比较// 大小写转换// 截取字符串(开头索引和结尾索引)// https。

2401_84123005的博客 1124

多思计组实验实验三、存储器读写实验

实验三、存储器读写实验

qq_53089329的博客 3651

Flutter学习~dart语言基础

*内置方法/函数:print();自定义方法:自定义方法的基本格式:返回类型 方法名称(参数1,参数2,...){方法体return 返回值;*/print('我是一个自定义方法');// print('调用系统内置的方法');//演示方法的作用域aaa(){aaa();// aaa();错误写法xxx();//调用方法/*面向对象编程(OOP)的三个基本特征是:封装、继承、多态封装:封装是对象和类概念的主要特性。

m0_60390991的博客 421

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Dart学习笔记 List Set Map详解

List Set Map详解 List中常用的属性和方法 常用属性: length 长度 reversed 翻转 (注意这是个属性,属性值为字符串) isEmpty 是否为空 isNotEmpty 是否为不空 常用方法: List.filled(num,value) (静态方法, 用num个value创建一个新的List) add 增加一个数组元素 addAll(List) 拼接数组 indexOf 查找,查找到就返回index,没有返回-1 remove 删除传入具体值 removeAt 删除传入索

乐彧 380

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Flutter开发之Dart的数据类型01,2021谈一下当下最合适的Android架构

// 是否是NaN值 print(d0.isNaN); // 是否是无穷大或者无穷小 print(d0.isInfinite); // 是否是有限的 print(d0.isFinite); // 是否为负数, 大于0即为false print(d0.isNegative); // 根据代码单元生成的哈希码 print(d0.hashCode); // 数据的符号,-1.0:值小于0、+1.0:值大于0、-0.0/0.0/NaN:值是其本身 print(d0.sign); print(-1.23.sign);

m0_66264588的博客 545

flutter - 将数字转换为科学记数法并获得指数 flutter

如何将数字转换为科学记数法并获得指数?例如,如果我有 0.000000001 并想将其转换为 1e-9 最佳答案 使用 intl package并尝试如下 final value = 0.000000025; String res = NumberFormat.scientificPattern(Localizations.localeOf(context).languageCode).format(value); print("Formatted value is $res"); 编辑 一种更好、更干净

坚果的博客 1096

Dart开发之——数据类型

Dart内置了7类数据类型,分别是: 数值类型(int,double) 字符串类型(单引号’'和双引号"") 布尔类型(true和false) 数组类型([]) 字典类型(map) 字符类型(Runes) 符号类型(Symbol) 二 数值类型(int,double) 2.1 说明 Dart中,数值类型有两种: 整数类型(int) 小数类型(double) 2.2 创建数值变量 2.2.1 整数 int a=1; var b=2; 2.2.2 小数 double c=3.14; var d=1.

我的博客 860

Flutter之List

void listDemo() { // 1.list的创建 listCreate(); // 2.多种类型的输出 listPrint(); // 3.添加数据 listAddElement(); // 4.删除数据 listRemoveElement(); // 5.更改列表元素 changeTheListElements...

aau88497的博客 2004

Flutter基础语法之数组

flutter数组方法,flutter数组语法

莫循的AI编程博客 4705

Dart集合方法

一、List 的常用方法 1、添加数据 方法:add() 参数:要添加的数据 代码: main() { List list = []; list.add('张三'); list.add(20); list.add(true); print(list); } 2、获取数组长度 方法:length 参数:无 代码: main() { List list = ['张三', 20, true]; print(list.length); } 3、创建指定长度的数组

SevenOne 300

dart语言学习第一天

any方法遍历,如果对象中有大于23岁的人就返回true,否则返回false。类似js的some方法。创建一个长度为2的数组,默认内容为空。split(separator) 字符转数组,传入一个字符,以字符内容来切割数组。给参数添加花括号,参数将是可选的,传参时写上具体参数的名称。where方法遍历,查询大于18岁的人。join(separator) 数组转字符串,传入一个分隔字符。addAll拼接数组,类似js的concat方法。函数的可选参数,给可选参数添加中括号。Map方法遍历数组,返回一个新数组。

c5163d的博客 329

02、Flutter开发Dart-数据类型

一、 数据类型 1.1. 数字类型 对于数值来说,我们也不用关心它是否有符号,以及数据的宽度和精度等问题。只要记着整数用int,浮点数用double就行了。 不过,要说明一下的是Dart中的int和double可表示的范围并不是固定的,它取决于运行Dart的平台。 // 1.整数类型int int age = 18; int hexAge = 0x12; print(age); print(hexAge); // 2.浮点类型double double height = 1.88; print(heig

qq_25218777的博客 399

flutter 创建固定长度的数组

flutter 创建固定长度的数组

qq_43573997的博客 702

【Flutter 异步编程 - 玖】 | 学习 Stream 的元素转换操作

theme: cyanosis 本文为稀土掘金技术社区首发签约文章,14天内禁止转载,14天后未获授权禁止转载,侵权必究! 张风捷特烈 - 出品 0. 前言 - 测试说明 Stream 是一种可连续监听的 事件序列 ,它本质上是对 发布-订阅 模式的具体实现,人们习惯于称其为 响应式 模式。很多编程语言都有 Rx[language] , 它们由 【ReactiveX】 ...

张风捷特烈的博客 855
上一篇: Flutter开发之Dart语法基础
下一篇: Flutter开发之Dart的数据类型02
CodeTitan
博客等级 码龄9年 51粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值