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 学习笔记 —— 创建Stream

可以使用如下方法创建Stream:
1)在Stream界面中使用静态工厂方法,
2)Iterable或Arrays上的流方法。

在Stream 接口中使用静态工厂方法

Java 8中新的java.util.stream.Stream接口提供了几种用于创建流的静态方法。 具体来说,我们可以使用静态方法Stream.ofStream.iterateStream.generate

static <T> Stream<T> of(T... values)

标准库中of方法的实现实际上委托给Arrays类中的stream方法

@SafeVarargs
public static<T> Stream<T> of(T... values) { 
    return Arrays.stream(values);
}

例子:

String days = Stream.of("monday", "tuesday", "wednesday")
    .collect(Collectors.joining(","));
System.out.println(days);
// prints monday,tuesday,wednesday

static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

根据Javadocs,此方法“返回通过将函数f迭代应用到初始元素种子而生成的无限、有序的Stream”。

List<BigDecimal> nums =
    Stream.iterate(BigDecimal.ONE, n -> n.add(BigDecimal.ONE) )
.limit(10)
        .collect(Collectors.toList());
System.out.println(nums);
// prints [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Stream.iterate(LocalDate.now(), ld -> ld.plusDays(1L))
    .limit(10)
.forEach(System.out::println)
// prints 10 days starting from today

static <T> Stream<T> generate(Supplier<T> s)

此方法通过反复调用 Supplier 来产生无序的 Stream。


long count = Stream.generate(Math::random).limit(10)
.forEach(System.out::println)

Using range and rangeClosed

Stream有三个专门用于基元的子接口:IntStream,LongStream和DoubleStream。
IntStream和LongStream有两个额外的工厂方法,用于创建Stream,range和rangeClosed。

static IntStream range(int startInclusive, int endExclusive)
static IntStream rangeClosed(int startInclusive, int endInclusive) static LongStream range(long startInclusive, long endExclusive) 
static LongStream rangeClosed(long startInclusive, long endInclusive)

Iterable或Arrays上的steam方法

如果已经有了一个集合,可以利用Collection接口的默认方法


List<String> bradyBunch = Arrays.asList("Greg", "Marcia", "Peter", "Jan",
    "Bobby", "Cindy");
names = bradyBunch.stream()
    .collect(Collectors.joining(","));
System.out.println(names);

总结

  • Stream.of(T... values)Stream.of(T t)
  • Arrays.stream(T[] array) 以及 int[], double[] 和long[] 的重载
  • Stream.iterate(T seed, UnaryOperator<T> f)
  • Stream.generate(Supplier<T> s)
  • 使用 rangerangeClosed:
    • IntStream.range(int startInclusive, int endExclusive)
    • IntStream.rangeClosed(int startInclusive, int endInclusive)
    • LongStream.range(long startInclusive, long endExclusive)
    • LongStream.rangeClosed(long startInclusive, long endInclusive)
  • Collection.stream()

评论

此博客中的热门博文

D3js Data-binding basics

JavaScript 数据类型

Vue3新特性(1) —— Vite