用 dart 语言从列表中填充 null 的最佳方法是什么

问题描述 投票:0回答:8

寻找与 python 过滤器等效的 dart

a = ['', None,4]
[print(e) for e in filter(None,a)]

我的代码太难看了:

List a = [null,2,null];
List b=new List();
for(var e in a){if(e==null) b.add(e);}
for(var e in b){a.remove(e);}
print(a);
dart
8个回答
166
投票

在新的 dart 2.12 中,具有完善的 null 安全性,最好的方法是:

List<int?> a = [null,2,null];
final List<int> b = a.whereType<int>().toList();

70
投票

使用 null-safety,如果结果列表的类型不可为空,则旧的 removeWhere 解决方案不再起作用。在removeWhere之后进行转换也不起作用。

最好的选择是导入集合

import 'package:collection/collection.dart';

它允许人们做

List<int> a = [null, 2, null].whereNotNull().toList();
print(a);
>>> [2]

56
投票

您可以像这样使用 List 的

removeWhere
方法:

List a = [null, 2, null];
a.removeWhere((value) => value == null);
print(a); // prints [2]

13
投票
  a.where((x) => x != null).forEach(print);

8
投票

在现代 Dart 中,您可以使用“collection if”和“collection for”,它们类似于 Python 的列表推导式:

List a = [null, 2, null];
List b = [for (var i in a) if (i != null) i];
print(b); // prints [2]

来源:https://github.com/dart-lang/language/blob/master/accepted/2.3/control-flow-collections/feature-specification.md#compositing


3
投票

我用@Wesley Changs的答案做了一个扩展功能。

  extension ConvertIterable<T> on Iterable<T?> {
    List<T> toNonNullList() {
      return this.whereType<T>().toList();
    }
  }

您可以像下面这样使用。

  List<int?> a = [null,2,null];
  final List<int> b = a.toNonNullList();

0
投票

总结并提供一种改进的解决方案,可以在

Iterable<E>
上使用扩展,如@BansookNam的答案所示。

extension NotNullIterable<E> on Iterable<E?> {
  Iterable<E> whereNotNullable() => whereType<E>();
}

使用示例

final nonNullList = [1, 2, 3, null, 4].whereNotNullable().toList();
对于这个问题,

更好的解决方案是根据@felix-ht的建议,使用package:collection/collection.dart


使用示例

import 'package:collection/collection.dart'; //... final nonNullList = [1, 2, 3, null, 4].whereNotNullable().toList();
    

0
投票

Dart 3.0 开始,Dart 有一个新的内置方法,用于从任何可迭代对象中获取非空元素 — nonNulls

此方法返回一个可迭代对象,因此如果您想要 List 类型,则必须使用

toList()

 将其转换为列表类型。

这是一些示例用法:

final a = [null, 2, null]; final b = a.nonNulls.toList();
如果你不需要原列表,可以直接拨打

nonNulls

final a = [null, 2, null].nonNulls.toList();
    
© www.soinside.com 2019 - 2024. All rights reserved.