PHP8 —— New String Helpers

新增了三个字符串函数,str_starts_with, str_ends_with, str_contains, PHP 的函数这么方便,很难想象竟然一直没有这几个。 str_starts_with 判断字符串是否以另一个字符串开头,在PHP7以及之前 $id = 'inv_abcdefgh'; $result = strpos($id, 'inv_') === 0; var_dump($result); // true PHP8 中可以直接这么写 $result = str_starts_with($id, 'inv_'); str_ends_with 判断字符串是否以另外一个字符串结尾,在 PHP7 及之前,比较麻烦,通常是这么写 $id = 'abcd_inv'; $result = strpos(strrev($id), strrev('_inv')) === 0; 或者 $result = substr($id, -1 * strlen('_inv')) === '_inv'; 或者上正则吧 $result = preg_match('/_inv$/', $id) === 1; 看起来都是比较麻烦的。PHP8 里面可以简化成下面这样了 $id = 'abcd_inv'; $result = str_ends_with($id, '_ind'); str_contains 字符串包含,PHP8 之前一般就是 strpos 来实现了 $url = 'https://example?for=bar'; $result = strpos($url, '?') !== FALSE; PHP8 就直接一点 $result = str_contains($url, '?');

Java学习笔记 —— Java 9 的 Collection 工厂方法

Java 9引入了一些方便的方法来创建小型集合对象。
先来看下传统写法:

List<String> friends = new ArrayList<>();
friends.add("Raphael"); 
friends.add("Olivia"); 
friends.add("Thibaut");

存储三个字符串需要写上面一堆代码。我们可以简化一下,使用Arrays.asList() 工厂方法:

List<String> friends 
    = Arrays.asList("Raphael", "Olivia", "Thibaut");

这样我们获得一个固定大小的列表,不能向其中添加元素或从中删除元素,否则会导致UnsupportedModificationException。 不过我们可以set方法对元素进行更新:

List<String> friends = Arrays.asList("Raphael", "Olivia");
friends.set(0, "Richard");
friends.add("Thibaut");

这些行为有点奇怪,因为这里的list底层是由固定大小的可变数组支持的。
那要创建一个 Set 怎么样?没有Arrays.asSet()工厂方法,我们需要使用一些其他的技巧。 使用HashSet构造函数,接受List作为参数:

Set<String> friends 
= new HashSet<>(Arrays.asList("Raphael", "Olivia", "Thibaut"));

或者可以使用 Stream API

Set<String> friends
    = Stream.of("Raphael", "Olivia", "Thibaut")
.collect(Collectors.toSet());

但是,这两种解决方案都远远不够优雅,并且隐式的产生了不必要的对象分配。
另外,传统上没有优雅的方法可以创建小数据量的 Map。下面我们来看一下 Java 9 新增的工厂方法。

List 工厂

需调用工厂方法List.of即可创建列表:

List<String> friends = List.of("Raphael", "Olivia", "Thibaut");
System.out.println(friends);

不过,尝试将元素添加到 friends 列表中:

List<String> friends = List.of("Raphael", "Olivia", "Thibaut");
friends.add("Chih-Chun");

运行此代码将导致java.lang.UnsupportedOperationException。 因为List.of 产生的列表是不可变的。 用set()方法更新项目会引发类似的异常。 不过,这种此限制是一件好事,可以避免意外修改。最后,为防止意外的错误并实现更紧凑的内部表示,不允许使用null元素。

Set 工厂

与List.of一样,您可以从元素列表中创建一个不可变的Set:

Set<String> friends = Set.of("Raphael", "Olivia", "Thibaut");
System.out.println(friends);

如果尝试通过提供重复的元素来创建Set,则会收到IllegalArgumentException。 此异常反映了Set元素的强制唯一性:

Set<String> friends = Set.of("Raphael", "Olivia", "Olivia");

Map 工厂

创建 Map 比创建 List 和 Set 要复杂一些,因为必须同时包含键和值。 在Java 9中可以通过两种方法初始化不可变 map。

可以使用工厂方法Map.of

Map<String, Integer> ageOfFriends
= Map.of("Raphael", 30, "Olivia", 25, "Thibaut", 26);
System.out.println(ageOfFriends);

如果要创建十个元素以内的小映射,此方法很方便。 要超越此范围,需要使用Map.ofEntries,该方法采用Map.Entry 对象,但使用varargs实现。

import static java.util.Map.entry; 
Map<String, Integer> ageOfFriends
    = Map.ofEntries(entry("Raphael", 30), entry("Olivia", 25), entry("Thibaut", 26));
                       
System.out.println(ageOfFriends);

评论

此博客中的热门博文

D3js Data-binding basics

JavaScript 数据类型

Vue3新特性(1) —— Vite