www.9778.com 2

www.9778.comC# 8.0的三个令人兴奋的新特性,

Laravel 6.5 已经发布,内容如下:

www.9778.com 1

www.9778.com 2

C# 8.0的三个令人兴奋的新特性,

www.9778.com 3

C#
语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。同时,C#
每个版本的发布都与同时期的 Visual Studio 以及 .NET
运行时版本高度耦合,这也有助于开发者更好的学习掌握 C#,并将其与 Visual
Studio 以及 .NET 的使用结合起来。

 

LazyCollection 的新方法

引入了一个新方法,该方法调用 Memy()
方法,返回新的 LazyCollection,它记住已经被计算过的值。

GitHub 上的拉请求示例:

$users = User::cursor()->remember();

// No query has been executed yet.

$users->take(5)->all();

// The query has been executed, and the first 5 users have been streamed from the DB.

$users->take(20)->all();

// The first 5 users came from the cache. The rest continued the stream from the DB.

LazyCollection类可以用于大数据集,而无需消耗大量内存。

本文是 DZone 指南 Java 生态系统的专题文章,作者Trisha
Gee是Java资深工程师和布道者。在本文中,Trisha Gee阐述了Java
8的重要特性以及使用的原因,由OneAPM工程师翻译。以下为译文要点速递在很多情况下,Java8
都能提升应用性能,而无需任何改变或性能调优。Lambda 表达式、 Streams API
以及现有类的新方法都是提高生产力的重要工具。Java8 新推出的 Optional
类型在处理 null 值时,能减少 NullPointerExceptions
的可能性,给开发者极大的灵活度。去年年初,Java8
粉墨登场,现在Java7便已行将就木。在明年底 Java9 推出之前,Java8 是
Oracle 唯一支持的版本。然而,许多公司都将稳定性放在第一位,所以都还在用
Java7,甚至 Java6。让我们来了解一下 Java8 的一些特性,让你在说服团队升级
Java
版本时理由能更充分一些。速度更快可以取悦老板、满足业务或运营人员的一大卖点是:Java8
运行应用时速度更快。通常,升级至 Java8
的应用都能得到速度上的提升,即便没有做任何改变或调优。对于为了迎合特定
JVM 而做出调整的应用,这或许并不适用。但 Java8
性能更优的理由还有很多:常见数据结构的性能提升:对广受欢迎的 HashMap
进行的基准测试表明,它们在 Java8
中的性能更好。这种提升非常吸引人——你无需学习新的 Streams API 或 Lambda
语法,甚至不需要改变现有的代码,就能提升应用的性能。垃圾回收器提升:通常,Java
应用性能取决于垃圾回收的效率。的确,糟糕的垃圾回收会很大程度上影响应用性能。Java8
对垃圾回收做了很多改变,能有效提升性能并简化调优。最为人熟知的改变是
PermGen 的移除与 Metaspace的引入。Fork/Join 速度提升:fork/join
框架是在 Java7 中首次引入的,目的是简化使用 JVM 的并发程序。Java8
中投入了很多努力进一步提升该框架。现在,fork/join 在 Streams API
中用于并发操作。此外,Java8 中还包含诸多改进以支持并发。Oracle 在 JDK 8
中总结了这些性能提升。代码行更少Java
经常被人们诟病其样本代码太多。为此,Java8 新的 API
采用了更具功能性的方式,专注于实现什么而不是如何实现。Lambda
表达式
Java8 中的 Lambda 表达式不仅是 Java 已有的匿名内部类—— Java8
推出之前传递行为的方法之外的语法糖衣。Lambda 表达式采用了 Java 7
的内部改变,因此运用起来相当流畅。想了解如何使用 Lambda
表达式简化代码,请继续阅读。集合新方法介绍Lambda 表达式与 Streams
可能是 Java8 最大的两个卖点,较少为人知的是 Java
现在允许开发者给现有类添加新的方法,而无需为了向后兼容性折中。这样,新的方法,结合
Lambda 表达式,能在很大程序上简化代码。比如,我们常常需要判断 Map
中的某个成员是否已经存在,如果不存在则创建之。在 Java8
之前,你可能会这么做:

Gaelyk 1.1 发布了。Gaelyk是一个针对Google App
Engine的、用于开发和部署Groovy应用程序的轻量级框架。该版本的改进包括:升级Groovy到1.8.4,升级App
Engine

加快 C# 版本的发布速度

在被称为“新微软”的推动下,微软创新的步伐也加快了。为了做到加快步伐,微软开发部门将一些过去集成在一起的技术现在都分离了出来。

Visual Studio、.NET Framework、.NET
运行时、编译器和编译运行时的运行语言都被拆分成自己的包和版本,这意味着以上每一个都可以按照自己的节奏发布了。现在,我们已经看到了这种模式的成功。.NET
Core 2.0 的工作已经完成了,并从 Visual Studio 发布出来,同时也增加了对
Linux 的支持。几乎与 .NET Core 2 发布的同时,C# 7.1 版本也发布了。

C# 7.1 是一个重要的发布版本,虽然新功能不多,但它却是 C#
第7个大版本的开始。C# 7.2 版本的工作已经展开了,同时也在计划着 C# 7.3
版本。尽管 C# 8.0 版本还有点远,但是微软技术人员已经对 C# 8.0
版本的特性有了一些想法。

语言设计的讨论是公开的,围绕 C# 8.0
版本新特性的问题部分也进行了广泛的讨论。检查每个发行版本的里程碑,同时也为未来的
C# 路线图做好评估。

下面正式开始介绍 C# 8.0 版本中令人兴奋的三个新特性。

 

两种新的字符串方法

该版本为 String Helper 提供了两个新方法:afterLast() 和
beforLast()。如下例子:

$type = 'AppNotificationsTaskstask updated';
Str::after load($type, '\'); // task updated

>$filename = 'photo.2019.11.04.jpg';
Str::before load($filename, '.'); // photo.2019.11.04
private final MapCustomerId, Customer customers = new HashMap();public void incrementCustomerOrders(CustomerId customerId) {Customer customer = customers.get(customerId);if (customer == null) { customer = new Customer(customerId); customers.put(customerId, customer);}customer.incrementOrders();}

SDK到1.6.0数据存储服务中的新方法get()现在也能在异步数据存储中使用在entities中新增了一个unindexed属性,用于设置未加索引的属性:person.unindexed.bio

“…”新增了三个注释,用于定义bean和entity的强制转换除了datastore.query{}和datastore.execute{}外,现在新增了datastore.iterate{}方法,会返回一个Iterator而不是一个列表,这对于返回大量结果的查询操作是友好的新增了预期的搜索服务现在可以使用memcache.async来访问异步缓存服务为文件服务新增了一些便利的方法详细信息参阅:release
note下载地址:

非空和可空的引用类型

C# 有两大变量类型:基本类型和引用类型。原先的类型是 int、char 和
double。这些类型都不能接受 null 值。在不分配新值的情况下,创建一个新的
int 值,会导致 int 值为 0 而不是 null。C# 2.0
介绍了带有“?”符号的变量原语的可空版本。因此,int?是 int
的一个版本,它可以接受空值。

另一方面,引用类型(如字符串这样的对象)始终能够接受 null 值,并将 null
作为默认值。这也带了来一个缺点,就是可能导致应用程序中带入空引用。

在 C# 8.0 中,将引用类型设为非空,成为了一个可选的特性。

为 C#
引入这样的特性是很困难的,因为这为原本已经运行很好的代码,引入了潜在的编译错误。因此需要做的是,创建此功能的方法,而不是为开发人员带来无法估量的工作量。

根据设计方案,C#
团队决定采取一个允许开发者可以选择可空引用类型的方法。这将是一个工程级别的设定,以便启用对可空引用的验证。一旦启用,可接受
null 值的对象就需要使用?运算符进行声明。

如下代码:

String s = null;
Console.Write(s);

这将引起警告,因为字符串不能接受空值。因此需要以下代码:

String? s = null;
Console.Write(s);

然而,上面代码也会在Console抛出一个警告,写的是不希望收到一个空字符串。事实上,原始代码可能有错误,所以级联警告可以帮助我们避免运行时错误。这是最有可能提高代码质量的语言变化。

 

Query Builder 新方法

查询生成器(用于创建和运行数据库查询的接口),此版本已经做了更新,增加了
existsOR 或 doesntExistOr 的方法。

$user->files()
->where zero('closed_at')
->doesntExistOr(function () {
abort(422, 'User already has an open dossier');
});

详情见发布说明:

(文/开源中国)    

操作“检查某个成员在 map 中是否存在,若不存在则添加之”是如此常用,Java
现在为 Map 添加了一个新方法 computeIfAbsent
来支持这个操作。该方法的第二个参数是一个 Lambda
表达式,该表达式定义了如何创建缺少的成员。

新的轻量级类:Records

C# 8.0 的一个很棒的新特性,是有一种新方式来创建一个被称为 records
的类。这个类本质上是一个非常轻量级的类,是一个字段集合,能够帮助快速创建
POCO 类型的对象,同时也可以解决比较对象是否相等时的关键问题。

例如,为银行帐户创建 record 类型:

class BankAccount(Guid Id, string Name, decimal Balance)

这是一种创建简单类的很好的方法。

用 records 解决对象相等问题

在 C#
编程中,一个最难掌握的内容就是,将==运算符用于引用类型和原语之间的区别。

为了举例说明,我们使用==对比两个整数:

int I = 1;
int j = 1;
i == j //yields true

原语的值是相等的。但是,对于引用类型,却不相等。

Object I = new Object();
Object j = new Object();
i == j //yields false

这是因为 C#
的引用类型比较会考虑引用相等,也就是说,只有当两个对象是同一个对象才相等。records
类型提供了结构上的相等,等同于相等运算符。创建新 record
的语法非常简洁,因为生成的对象是简单的数据传输对象。

Records 是一个轻量级对象,使用起来非常方便。虽然 Records
不是语言的一个突破性的变化,但也是一个渐进的改进,值得欢迎。

 

public void incrementCustomerOrders(CustomerId customerId) {Customer customer = customers.computeIfAbsent(customerId, id - new Customer(id));customer.incrementOrders();}

默认接口实现

版本控制接口可能会令人懊恼,
因为它要求接口上的新方法来实现接口上的所有对象。随着新方法添加到了接口中,实现它们的任务就落在了实现接口的各个类中。因为各个实现不必须共有同一个父类,添加到接口的方法就可以在各自的类中实现。

默认接口实现允许在接口中指定一个实现,只要它是接口上现有方法的函数实现的。下面再以银行帐户为例:

public interface IBankAccountManager{
    void PerformTransaction(decimal amount, string reason);
}

现在为了便于使用,我们想在银行账户上提供明确的借方和信誉功能。通常我们会为接口添加这些功能并在所有的类中实现它们。

public interface IBankAccountManager{
    void PerformTransaction(decimal amount, string reason); 
    void PerformDebit(decimal amount, string reason){ 
        PerformTransaction(-1 * amount, $”Debit: {reason}”); 
    } 

    void PerformCredit(decimal amount, string reason){ 
        PerformTransaction(amount, $”Credit: {reason}”); 
    } 
}

默认接口实现提供了一种强大的新方法来扩展实现接口的类,而无需重复代码。只需遵从默认实现,许多接口的类的实现就可以得到大大简化。

 

其实,Java8 还有一个新的特性,称为方法引用(method
references),它能使我们用更简洁的代码实现该功能:

其它的 C# 8.0 新特性

正是因为这些新特性,才让我们毫不怀疑这就是 C# 8.0。以下是其它一些 C#
8.0 新特性:

  • 提升扩展支持 –
    这种提升不仅仅可以用于扩展方法,它还提供了对属性、静态方法和更多方面的支持。
  • 异步数据流 – 能够拥有支持异步操作的枚举值。包括新的 iasyncenumerable
    <T> 和 iasyncenumerator <T> 接口。
  • Async Disposable – iasyncdisposable 允许对象有一个异步的处理方法。

 

public void incrementCustomerOrders(CustomerId customerId) {Customer customer = customers.computeIfAbsent(customerId, Customer::new);customer.incrementOrders();}

结论

过去几年中,.NET 的创新速度确实加快了。虽然 C# 8.0
目前还没有实现,但是它比起 C#
7.0,将带来很多有帮助的提升,让我们一起期待 C# 8.0 的早日到来。

原文链接:

转载请注明出自:葡萄城控件

 

相关阅读:

【报表福利大放送】100余套报表模板免费下载

为什么你需要将代码迁移到ASP.NET Core 2.0?

是什么优化让 .NET Core 性能飙升?

C#开发人员应该知道的13件事

 

8.0的三个令人兴奋的新特性, C#
语言是在2000发布的,至今已正式发布了7个版本,每个版本都包含了许多令人兴奋的新特性和功能更新。…

Java8 为 Map 与 List
都添加了新方法。你可以了解一下这些新方法,看它们能节省多少行代码。Streams
API
www.9778.com,Streams API
为查询、操纵数据提供了更多灵活度。这是一个很强大的功能。阅读这些文章能对
Streams API
有更全面的了解。在大数据时代建立流畅的数据查询会非常有趣,而且也是常用的操作。比如,你有一列书,你希望按照字母表顺序排列这些书的作者名,且不含重复。

public ListAuthor getAllAuthorsAlphabetically(ListBook books) {ListAuthor authors = new ArrayList();for (Book book : books) { Author author = book.getAuthor(); if (!authors.contains(author)) { authors.add(author); }}Collections.sort(authors, new ComparatorAuthor() { public int compare(Author o1, Author o2) { return o1.getSurname().compareTo(o2.getSurname()); }});return authors;}

在上面的代码中,我们首先遍历这列书,如果书的作者从未在作者列表出现,则添加之。之后,我们根据作者的姓氏按字母表顺序对这些作者排序。这种排序操作正是
Streams 擅长解决的领域:

public ListAuthor getAllAuthorsAlphabetically(ListBook books) {return books.Streams() .map(book - book.getAuthor()) .distinct() .sorted((o1, o2) - o1.getSurname().compareTo(o2.getSurname())) .collect(Collectors.toList());}

上面的做法不仅代码行更少,而且描述性更强——后来的开发者读到这段代码能够轻易理解:1、代码从书中获取作者姓名。2、只在意从未出现过的作者。3、返回的列表按照作者姓氏排序。将
Streams API 与其他新特性——方法引用(method
references)、比较器(Comparator)的新方法结合使用,可以得到更加简洁的版本:

public ListAuthor getAllAuthorsAlphabetically(ListBook books) {return books.Streams() .map(Book::getAuthor) .distinct() .sorted(Comparator.comparing(Author::getSurname)) .collect(Collectors.toList());}

这里,排序方法按照作者姓氏排序,更加显而易见了。便于并行此前我们浅聊过更利于开箱即用的性能,除了前面提到过的特性,Java8
能更好地利用 CPU 内核。将前例中的 Streams 方法替换为
parallelStreams,JVM 会将此运算分解为不同的任务,使用 fork/join
将这些任务运行在多个核上。然而,并行化并不是加速所有运算的魔法。并行化运算总是会带来更多工作——分解运算,整合结果,因此无法总是减少时间。但是,对适合并行化的例子,这么做还是颇有效率的。最大化减少
Null 指针
Java8 的另一个新特性是全新的 Optional
类型。该类型的含义是“我可能有值,也可能是 null。“这样一来,API
就可以区分可能为 null 的返回值与绝对不会是 null 的返回值,从而最小化
NullPointerException 异常的发生几率。Optional 最赞的用处是处理
null。例如,假设我们要从一个列表中找一本特定的书,新创建的 findFirst()
方法会返回 Optional
类型的值,表明它无法确保是否找到特定的值。有了这个可选择的值,我们接下来可以决定,如果是
null 值要如何处理。如果想要抛出一个自定义的异常,我们可以使用
orElseThrow:

public Book findBookByTitle(ListBook books, String title) {OptionalBook foundBook = books.Streams() .filter(book - book.getTitle().equals(title)) .findFirst();return foundBook.orElseThrow(() - new BookNotFoundException("Did not find book with title " + title));}

或者,你可以返回其他书:

return foundBook.orElseGet(() - getRecommendedAlternativeBook(title));

或者,返回 Optional
类型,这样,该方法的调用者可以自己决定书没找到时要怎么做。总结Java8
作为 Java
语言的一次重大发布,包含语法上的更改、新的方法与数据类型,以及一些能默默提升应用性能的隐性改善。Oracle
已经不再支持 Java 7,因此许多公司都被迫向 Java8 转移。好消息是,Java8
对业务、现有的应用以及期望提高生产力的开发者都好好多。原文链接:Why
Java 8?