首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带有泛型可比较as参数的Dart List.sortedBy函数不会操作该列表

基础概念

List.sortedBy 是 Dart 语言中的一个函数,用于根据指定的键对列表进行排序。这个函数接受一个泛型参数 T 和一个函数 as,其中 as 函数用于从列表中的每个元素提取一个可比较的值。

相关优势

  1. 类型安全:使用泛型可以确保传入的列表和提取函数类型匹配,减少运行时错误。
  2. 灵活性:可以根据不同的键对列表进行排序,而不需要修改列表本身的结构。
  3. 简洁性:代码更加简洁易读,减少了手动排序的复杂性。

类型

List.sortedBy 函数的类型定义如下:

代码语言:txt
复制
List<T>.sortedBy<R extends Comparable<R>>(R Function(T) key)

其中:

  • T 是列表元素的类型。
  • R 是用于比较的值类型,必须是 Comparable 的子类。

应用场景

假设我们有一个学生列表,每个学生有一个年龄属性,我们可以使用 sortedBy 函数按年龄对学生进行排序:

代码语言:txt
复制
class Student {
  final String name;
  final int age;

  Student(this.name, this.age);
}

void main() {
  List<Student> students = [
    Student('Alice', 20),
    Student('Bob', 18),
    Student('Charlie', 22),
  ];

  List<Student> sortedStudents = students.sortedBy((student) => student.age);

  print(sortedStudents.map((e) => e.name).join(', ')); // 输出: Bob, Alice, Charlie
}

问题及解决方法

如果你发现 List.sortedBy 函数不会操作该列表,可能有以下原因:

  1. 返回值问题sortedBy 函数返回一个新的排序后的列表,而不是修改原列表。如果你希望修改原列表,可以使用 sort 方法。
  2. 比较函数问题:确保提取的比较值是可比较的(即实现了 Comparable 接口)。
  3. 空值问题:如果列表中包含空值,可能会导致排序失败。确保列表中的元素不为空。

示例代码

代码语言:txt
复制
void main() {
  List<Student> students = [
    Student('Alice', 20),
    Student('Bob', 18),
    Student('Charlie', 22),
  ];

  // 使用 sortedBy 函数
  List<Student> sortedStudents = students.sortedBy((student) => student.age);
  print(sortedStudents.map((e) => e.name).join(', ')); // 输出: Bob, Alice, Charlie

  // 如果希望修改原列表,可以使用 sort 方法
  students.sort((a, b) => a.age.compareTo(b.age));
  print(students.map((e) => e.name).join(', ')); // 输出: Bob, Alice, Charlie
}

参考链接

通过以上解释和示例代码,你应该能够理解 List.sortedBy 函数的使用方法及其常见问题,并能找到相应的解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Dart语法详解系列篇(四)-- 、异步、库等有关详解九、(Generics)十、库和可见性十一、异步支持十二、Isolates十三、生成器(Generators)十四、类型定义十五、元数据

类型安全通常需要,但它们比仅允许代码运行有更多好处: 1).正确指定类型可以生成更好代码。 如果您希望列表只包含字符串,则可以将其声明为List(将其读作“字符串列表”)。...可以省去创建所有这些接口麻烦。你可以创建一个带有类型参数接口。 示例如下:T是一个占位符,您可以将其视为开发人员稍后定义类型。...例如:var foo = Foo; (六)使用方法 新版本Dart方法,允许在方法和函数上使用类型参数。...在函数返回类型(T)中 2). 在参数类型(List)中 3). 在局部变量类型(T tmp) 方法可以声明类方法(实例和静态)以相同方式获取参数。...这些函数是异步:它们在设置可能耗时操作(例如I / O)后返回,而不等待操作完成。

3.8K40

『Flutter开发实战』一小时掌握Dart语言

Dart 支持,比如 List(表示一组由 int 对象组成列表)或 List(表示一组由任何类型对象组成列表)。...调用父类非默认构造函数 默认情况下,子类构造函数会调用父类匿名无参数构造方法,并且该调用会在子类构造函数函数体代码执行前,如果子类构造函数还有一个 初始化列表,那么初始化列表会在调用父类构造函数之前被执行... 符号表示数组是一个 (或 参数化类型) 通常 使用一个字母来代表类型参数,比如 E、T、S、K 和 V 等等。 为什么使用?...Foo(); 使用方法 起初 Dart 只支持在类声明时指定,现在同样也可以在方法上使用,称之为 方法: T first(List ts) { //...参数类型 (List)。 局部变量类型 (T tmp)。 你可以查阅 使用函数 获取更多关于信息。

5K10
  • Dart dart:mirrors 库

    文档经常滥用带有Dart伪代码符号,例如o.x(a),其中o和a被定义为对象;在这些情况下实际意味着o'.x(a')其中o'和a'是分别与o和a绑定Dart变量。...此外,o'和a'被假定为新变量(意味着它们与程序中任何其他变量不同) 有时文档引用序列化对象。...当且仅当它是num,bool,String,一个跨隔离序列化对象列表,或者带有键和值Map(这些键和值都可以跨隔离序列化)实例时,对象才可以跨隔离进行序列化....状态:不稳定 dart:mirrors库不稳定,其API可能会因用户反馈而略有变化。 库依赖于平台,因此它具有dart2js和Dart VM实现。 两者都在开发中,可能还不支持所有操作。...TypeVariableMirror TypeVariableMirror表示类型类型参数. VariableMirror VariableMirror反映了Dart语言变量声明.

    1.4K30

    flutter--Dart基础语法(三)类和对象、、库

    大家也可以参考 Dart编程语言中文网。 上一篇文章主要是写了Dart语言流程控制、函数和异常处理,本文将接着上一篇文章继续往后写,本文将主要介绍Dart语言类和对象、以及库使用。...注意二: 不能显式实例化一个枚举 四、 定义主要有以下两种: 在程序编码中一些包含类型参数类型,也就是说参数只可以代表类,不能代表个别对象。...通过创建一个带有参数接口,来代替上述接口: abstract class Cache { T getByKey(String key); void setByKey(String key...这是一个类型占位符,在开发者调用接口时候会指定具体类型。 4.2 List、Set、Map中使用 4.2.1 字面量中 List , Set 和 Map 字面量也是可以参数。...return tmp; } 这里 first () 可以在如下地方使用参数 T : 函数返回值类型 (T). 参数类型 (List). 局部变量类型 (T tmp).

    3.7K70

    Dart学习笔记

    布尔类型为bool type variable = val 在定义时指定固定类型type,则变量类型固定,且只能接收特定类型赋值 比较特殊,如果type是Object或者dynamic,则变量可以接收任意类型数值赋值...),比较独特为形参两种定义方式,以及Dart允许将函数作为形参(函数类型为Function) 可选参数 returnType name ({type1 variable1 , type2 variable2...}){} 通过一个{}将多个形参定义包围,代表所有参数都为可选参数,没传递参数默认为null 此种类型定义在调用时传递参数需要指定入参变量名,入参与形参对应关系和位置无关,比如 // 函数定义...关键字进行继承,Dart允许通过mixin实现伪多继承 继承构造 子类构造函数默认继承父类构造函数(隐式调用) 通过在子类构造函数形参列表后使用:可以修改要使用父类构造函数,比如 class...Dart也支持类似于java和方法,比如 tips:方法作用就是为了在调用指定方法时传递,覆盖类 class A{ T val; void f(K

    1.1K30

    Dart 学习之开发语言概览,带思维导图(二)

    Point.origin(){ x = 0; y = 1; } } 调用父类非默认构造函数 调用顺序 1.初始化列表 2.父类参数构造函数 3.当前类构造函数 传递给父类构造函数参数不能使用...使用with关键字 使用mixin定义 使用on规定哪个类可以使用 覆写操作符基本格式: 返回类型 operator 操作符(参数1,参数2...){ 实现体......为什么使用 通常使用一个字母来代表类型参数,比如E、T、S、K 和 V 等等 适当地指定可以更好地帮助代码生成 使用可以减少代码重复 代码错误提示 void main(List args) { // 与字面量相对应,也可以通过构造函数方式使用 Map map = Map(); } 集合以及他们所包含类型...} class Extender extends SomeBaseClass {} 使用方法 函数返回类型 参数类型List 局部变量类型 void main(List args

    1.7K20

    【Flutter】Dart ( 类 | 方法 | 特定类型约束 )

    文章目录 一、Dart 类与方法 二、Dart 特定类型约束 三、Dart 自带 四、完整代码示例 五、 相关资源 一、Dart 类与方法 ---- 作用 : 为 类 ,...Tom I/flutter (24673): 测试, 类型整型, 获取缓存内容为 18 二、Dart 特定类型约束 ---- 还可以进行特定类型约束 , 如指定类型必须是某个类子类...'package:flutterapphello/Dart_OOP.dart'; /// 测试类 class Generic{ /// 方法测试类及方法 void test(...int _grade; String school; String city; String address; /// 父类构造函数调用 : 如果父类有非空参数构造函数, 子类必须实现相同参数构造函数...} 是可选参数, 可选参数必须在构造函数参数列表中最后一个 /// /// 默认参数 : 可选参数中如果用户不初始化可选参数 , 那么为其指定一个默认值 /// {this.city =

    5.1K00

    Flutter-从入门到项目 05:Dart语法快速掌握(下)

    如果没有为之提供默认值,那么参数默认值将会是 null。...>标记表示此表为一个类型(或为参数化结构)—— 一种含有正规类型参数类型。按照惯例,类型变量通常为单字符名称,例如 E,T,S,K,以及V。...Dart虚拟机)能检测到将一个非字符串变量分配到List中很可能是错误,这里给出一个样例: // void genericsFunc(){ var names = List......你想到了这个方法. // 类型可以减少你创建这些接口困难。...取而代之是,你只需要创建一个带有一个类型参数接口即可: // 接下来就牛逼了 abstract class Cache{ // 在这个代码中,T是一个替代类型,即占位符,你可以将他视为后续被开发者定义类型

    1.4K20

    《深入浅出DartDart

    这是在许多编程语言中都存在一种重要特性,Dart也不例外。在这篇文章中,我们将深入探讨Dart概念 在讨论如何在Dart中工作之前,我们首先需要了解什么是。...在Dart中使用 集合与 我们已经在List和Map这样集合类型中使用过,其中T、K和V是类型参数。...在List中,参数是int,表示列表只能包含整数。在Map中,有两个参数,String和int,表示这个映射键是字符串,值是整数。...,该函数接受一个特定类型列表,并返回第一个元素。...我们使用不同类型列表调用了这个函数,每次都正确地返回了第一个元素。 和类型推断 Dart类型推断能力意味着我们通常不需要显式指定类型,Dart可以根据上下文自动推断出正确类型。

    18330

    Dart 基础知识笔记

    tour main() 函数Dart 程序入口 main() 函数返回 void 并具有可选 List 参数作为参数 所有对象都从 Object 类继承 Dart 是强类型 当您想明确地不希望有任何类型时...关键字是可选 (Dart 2开始) Dart函数也是对象,其类型为 Function,可以将函数分配给变量或作为参数传递给其他函数 Dart箭头语法 => expr 用于简化仅包含一个表达式函数...首先列出必需参数,然后列出所有可选参数 Dart 函数可选参数可以是命名参数,也可以是位置参数 Dart 函数可以使用 = 来定义命名参数和位置参数默认值。...默认值必须是编译时常量 ~/ 返回除法整数结果 Dart switch 语句使用 == 比较整数、字符串、枚举或编译时常量 Dart所有异常都是未经检查异常 Dart 提供 Exception...非 final 实例变量还会生成隐式 setter 方法 Dart 中每个类都隐式定义一个接口 Dart 在运行时会携带其类型信息 (相反,Java中 使用了 erasure ,这意味着在运行时会删除类型参数

    1.1K40

    起飞了!Git新开源高星《Flutter跨平台开发入门与实战笔记》安卓高阶必备

    开发环境搭建和调试 Dart语法篇之基础语法(一) Dart语法篇之集合使用与源码解析(二) Dart语法篇之集合操作函数与源码分析(三) Dart语法篇之函数使用(四) Dart语法篇之面向对象基础...(五) Dart语法篇之面向对象继承和Mixins(六) Dart语法篇之类型系统与(七) Flutter中widget 注:鉴于目前网上还没有比较规范、系统整理,学习手册中内容都是根据笔者一个框架在网上进行搜集整理...、LinkedHashMap、SplayTreeMap区别 命名构造函数from和of区别以及使用建议 …… 第七章 Dart语法篇之集合操作函数与源码分析(三) Iterable Iterable...类关系图 Iterable类方法图 forEach 介绍 使用方式 源码解析 map any every …… 第八章 Dart语法篇之函数使用(四) 函数参数 匿名函数(闭包,lambda) 箭头函数...类函数 …… 第十章 Dart语法篇之面向对象继承和Mixins(六) 类单继承 基于Mixins多继承 …… 第十一章 Dart语法篇之类型系统与(七) 可选类型 接口类型 类型具体化

    1.4K10

    从java到JavaScript(2):对比JavaGoSwiftRust看Dart

    ,级联操作符,级联操作符 (…) 可以在同一个对象上 连续调用多个函数以及访问成员变量。——回顾jquery链式调用,end()as、 is、 和 is!...取不到值不会抛异常,直接返回nullMap和List可以转换为Json,来回转换时深拷贝。函数Dart函数比java多了几个概念。...比如在参数列表里面添加个大括号,是可选命名参数;加个中括号叫可选位置参数。...目前比较流行解决方案都是这个,比如Python,Kotlin都这么使用。一般在网络请求或者数据库操作时候使用,就像java多线程基础版吧。异步这块东西有点多,而且很重要,直接贴官方地址。...,非常适合构建网络应用程序,这是正确,如果你不需要其他功能,如

    92010
    领券