dart 学习 之 字符串插值,空变量 null,避空运算符,条件属性访问,集合字面量,箭头语法

2023-09-13 13:31:30

字符串插值(String interpolation)

下面是一些使用字符串插值的例子:
Here are some examples of using string interpolation:

String     									result
字符串 										结果
'${3 + 2}'	 	  							 '5'
'${"word".toUpperCase()}'	 				'WORD'
The value of '$myObject' 					myObject.toString().

小练习:
Q: 下面的方法接收两个整型变量作为参数,然后让它返回一个包含以空格分隔的整数的字符串。例如,stringify(2, 3) 应该返回 ‘2 3’。
A:

String stringify(int x, int y) {
  return '${x} ${y}'
}

或者
String stringify(int x, int y) {
return ‘KaTeX parse error: Double superscript at position 10: {x}' + ' '̲ + '{y}’;
}

空变量 null

Dart 要求使用健全的空安全,这意味着除非变量显式声明为可空类型,否则它们将不能为空。换句话说,类型默认是不可为空的。
举个例子,下面的代码在空安全下是有错误的,因为 int 类型的变量不能为 null:

int a = null; // INVALID.

你可以通过在类型后添加 ? 来表示该类型可空:

int? a = null; // Valid.

在所有 Dart 版本中,null 在未初始化的变量里都是默认值,所以你可以这样简化你的代码:

int? a; // The initial value of a is null.

Q:
试着定义以下两种变量:

一个可空的 String,名为 name,值为 ‘Jane’。

一个可空的 String,名为 address,值为 null。

A:

String ?name = 'Jane';
String ?address ;

避空运算符

Dart 提供了一系列方便的运算符用于处理可能会为空值的变量。其中一个是 ??= 赋值运算符,仅当该变量为空值时才为其赋值:

int? a; // = null
a ??= 3;
print(a); // <-- Prints 3.

a ??= 5;
print(a); // <-- Still prints 3.

另外一个避空运算符是 ??,如果该运算符左边的表达式返回的是空值,则会计算并返回右边的表达式。

print(1 ?? 3); // <-- Prints 1.
print(null ?? 12); // <-- Prints 12.
String? baz = foo ?? bar; // 如果 foo 是 null 才会赋值为 bar

条件属性访问

要保护可能会为空的属性的正常访问,请在点(.)之前加一个问号(?)。

myObject?.someProperty

上述代码等效于以下内容:

(myObject != null) ? myObject.someProperty : null

你可以在一个表达式中连续使用多个 ?.:

myObject?.someProperty?.someMethod()

如果 myObject 或 myObject.someProperty 为空,则前面的代码返回 null(并不再调用 someMethod)。

Q:
尝试使用条件属性访问来完成下面的代码片段。

// This method should return the uppercase version of `str`
// or null if `str` is null.
String? upperCaseIt(String? str) {
  // Try conditionally accessing the `toUpperCase` method here.
  
}

A:

return str?.toUpperCase()  ;  // 如果不为空就返回大写字母

集合字面量

Dart 内置了对 list、map 以及 set 的支持。你可以通过字面量直接创建它们:

final aListOfStrings = ['one', 'two', 'three'];
final aSetOfStrings = {'one', 'two', 'three'};
final aMapOfStringsToInts = {
  'one': 1,
  'two': 2,
  'three': 3,
};

Dart 的类型推断可以自动帮你分配这些变量的类型。在这个例子中,推断类型是 List、Set和 Map<String, int>。

你也可以手动指定类型:

final aListOfInts = <int>[];
final aSetOfInts = <int>{};
final aMapOfIntToDouble = <int, double>{};

在使用子类型的内容初始化列表,但仍希望列表为 List 时,指定其类型很方便:

final aListOfBaseType = <BaseType>[SubType(), SubType()];

Q:
尝试将以下变量设定为指定的值。替换当前的 null 值。

// Assign this a list containing 'a', 'b', and 'c' in that order:
final aListOfStrings =null ;

// Assign this a set containing 3, 4, and 5:
final aSetOfInts = null;

// Assign this a map of String to int so that aMapOfStringsToInts['myKey'] returns 12:
final aMapOfStringsToInts = null;

// Assign this an empty List<double>:
final anEmptyListOfDouble = null;

// Assign this an empty Set<String>:
final anEmptySetOfString = null;

// Assign this an empty Map of double to int:
final anEmptyMapOfDoublesToInts = null;

A:

// Assign this a list containing 'a', 'b', and 'c' in that order:
final aListOfStrings = ['a', 'b', 'c'];

// Assign this a set containing 3, 4, and 5:
final aSetOfInts = {3, 4, 5};

// Assign this a map of String to int so that aMapOfStringsToInts['myKey'] returns 12:
final aMapOfStringsToInts = {'myKey': 12};

// Assign this an empty List<double>:
final anEmptyListOfDouble = <double>[];

// Assign this an empty Set<String>:
final anEmptySetOfString = <String>{};

// Assign this an empty Map of double to int:
final anEmptyMapOfDoublesToInts = <double, int>{};

箭头语法

你也许已经在 Dart 代码中见到过 => 符号。这种箭头语法是一种定义函数的方法,该函数将在其右侧执行表达式并返回其值。

例如,考虑调用这个 List 类中的 any 方法:

bool hasEmpty = aListOfStrings.any((s) {
  return s.isEmpty;
});

这里是一个更简单的代码实现:

bool hasEmpty = aListOfStrings.any((s) => s.isEmpty);

看看下面的代码

class MyClass {
  int value1 = 2;
  int value2 = 3;
  int value3 = 5;

  // Returns the product of the above values:
  int get product => value1 * value2 * value3;
  
  // Adds 1 to value1:
  void incrementValue1() => value1++; 
  
  // Returns a string containing each item in the
  // list, separated by commas (e.g. 'a,b,c'): 
  String joinWithCommas(List<String> strings) => strings.join(',');
}
更多推荐

进阶JS-reduce用法

reduce()reduce()方法为循环遍历数组,将其结果汇总为单个返回值,最常用的场景有数组求和、数组求积、数组中元素出现的次数、数组去重等等。语法:arr.reduce(function(prev,cur,index,arr){...},init);参数:prev必需。累计器累计回调的返回值;表示上一次调用回调时

攻防世界-web-ics-05

ics-05GFSJ0332积分3金币377最佳Writeup由darkless提供收藏反馈难度:3方向:Web题解数:35解出人数:6403题目来源:XCTF题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统题目场景:http://61.147.171.105:53619100%倒计时:3时59分0秒

代码随想录训练营第四十八天|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

198.打家劫舍力扣题目链接(opensnewwindow)你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一

ChatGPT:Java中的try-catch-finally及return语句的执行顺序解析

ChatGPT:Java中的try-catch-finally及return语句的执行顺序解析Java中的try-catch-finally,为什么try里面有return语句,finally里面的语句还能执行ChatGPT:在Java中,当在try块中存在return语句时,finally块中的语句仍然会执行。这是因

深入理解Ansible:简化服务器管理和自动化任务的利器

导言:在现代IT环境中,管理和维护服务器和应用程序变得愈发复杂,而自动化工具如Ansible成为了解决这些挑战的关键。本文将详细介绍什么是Ansible,以及如何使用它来简化服务器管理和自动化任务。第一部分:什么是Ansible?Ansible是一款开源的自动化工具,用于配置管理、应用程序部署和任务自动化。它基于SSH

docker中已创建容器的修改方法

环境信息以CentOS8为例停止容器#dockerstop容器名或iddockerstopmysql停止docker服务systemctlstopdocker修改docker配置文件配置文件在:/var/lib/docker/containers/{容器id}如:/var/lib/docker/containers/9

玫瑰代码||逐字打印字体||中秋快乐

关注微信公众号「ClassmateJie」更多惊喜等待你的发掘直接看实现效果电脑端手机端使用场景发给女神告白~提供一些文案“自从遇见你,我的世界变得不一样了。每一天都因为你而变得特别。我想告诉你,我喜欢你,不仅仅是因为你的美丽,还因为你温暖的心灵和聪明的头脑。"“我一直在寻找那个能让我心动的人,而现在我知道,那个人就是

记一次 .NET 某餐饮小程序 内存暴涨分析

一:背景1.讲故事前些天有位朋友找到我,说他的程序内存异常高,用vs诊断工具加载时间又太久,让我帮忙看一下到底咋回事,截图如下:确实,如果dump文件超过10G之后,市面上那些可视化工具分析起来会让你崩溃的,除了时间久之外这些工具大多也不是用懒加载的方式,比如dotmemory会把数据全部灌入内存,针对这种dump,你

滚雪球学Java(29):数组长度和排序算法:让你的程序更高效

🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!前言在上一篇文章中,我们学习了数组的常用技巧和方法。本篇文章将深入探讨数组长度以及如何使用排序算法提高程序效率。摘要数组长度是数组中元素的个数,可以使用length属性获取。

Vue入门

Vue的介绍1.什么是vue?vue是一个渐进式js框架,它被设计用于构建用户界面和单页应用程序。Vue.js很容易上手,易于学习,并且是一种非常灵活的开发工具。1特点:轻量级:Vue.js的文件大小只有20KB左右,非常适合快速构建小型应用程序。双向数据绑定:Vue.js使用MVVM(Model-View-ViewM

【MATLAB第75期】#源码分享 | 基于MATLAB的不规则数据插值实现时间序列数据扩充

【MATLAB第75期】#源码分享|基于MATLAB的不规则数据插值实现时间序列数据扩充如时间数据以单位1为间隔排序,可插间隔为0.5的数据。一、实现效果1.规则间隔数据2.非规则间隔数据二、主程序代码1.插值测试效果%%清空环境变量warningoff%关闭报警信息closeall%关闭开启的图窗clear%清空变量

热文推荐