博文

目前显示的是标签为“Stream”的博文

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学习笔记 —— 给Map排序

Map接口包含一个称为Map.Entry的公共、静态、内部接口,该接口表示键值对。 Map.entrySet方法返回一组Map.Entry元素。 在Java 8之前,给map排序时主要使用接口中的getKey和getValue方法。 Java8 中,增加了下表中的静态方法。 方法 描述 comparingByKey(Comparator<? super K> cmp) Returns a comparator that comparesMap.Entryby key using the givenComparator comparingByValue() Returns a comparator that comparesMap.Entryin natural order on value comparingByValue(Comparator<?superV>cmp) ReturnsacomparatorthatcomparesMap.Entryby value using the givenComparator 下面用计算字典中单词长度和数量映射,来说明怎么使用这些方法。 Unix系统在 /usr/share/dict/words 目录中包含一个文件,保存了Webster第二版词典的内容。 我们用 Files.lines方法读取文件行并生成包含这些行的字符串流。 System.out.println("\nNumber of words of each length:"); try (Stream<String> lines = Files.lines(dictionary)) { lines.filter(s -> s.length() > 20) .collect(Collectors.groupingBy( String::length, Collectors.counting())) .forEach((len, num) -> System.out.printf("%d: %d%n", len, num)); } catch (IOException e) {...

Java 学习笔记 —— 获取文件Stream

java.nio.file.Files类中的静态列表方法将Path用作参数,并返回包装DirectoryStream的Stream。 DirectoryStream接口扩展了AutoCloseable,因此使用list方法最好通过try-with-resources构造完成。 try (Stream<Path> list = Files.list(Paths.get("src/main/java"))) { list.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } 假设这是在具有标准Maven或Gradle结构的项目的根目录中执行的,这将打印 src/main/java 目录中所有文件和文件夹的名称。 因为使用了try-with-resources,在try块完成时,系统将在stream上调用close,然后在底层DirectoryStream上调用close。 src/main/java/collectors src/main/java/concurrency src/main/java/datetime ... src/main/java/Summarizing.java src/main/java/tasks src/main/java/UseFilenameFilter.java list方法的签名显示返回类型为Stream ,其参数为目录: public static Stream<Path> list(Path dir) throws IOException 在非目录资源上执行该方法将导致NotDirectoryExcep tion。Javadocs指出,结果流是弱一致性的,这意味着“它是线程安全的,但在迭代时不会冻结目录,因此它可能(也可能不会)反映从此方法返回后发生的目录更新。”

Java 学习笔记 —— 创建Stream

可以使用如下方法创建Stream: 1)在Stream界面中使用静态工厂方法, 2)Iterable或Arrays上的流方法。 在Stream 接口中使用静态工厂方法 Java 8中新的 java.util.stream.Stream 接口提供了几种用于创建流的静态方法。 具体来说,我们可以使用静态方法 Stream.of , Stream.iterate 和 Stream.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 -> ...