1.数据转换

该类Stream<T>还有一个方法可以让您将数据从一种类型转换为另一种类型。这个方法是map()

它还返回一个流,但具有不同类型的元素。该map()方法将一个将一种数据类型转换为另一种数据类型的函数作为方法参数。

例子:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map((x) -> String.valueOf(x));
将流转换IntegerString

传递给该方法的函数参数map()采用数字x并返回其字符串表示形式。顺便说一句,您可以将这段代码写得更紧凑:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
将流转换IntegerString

将字符串转换为数字

同样,您可以编写代码将字符串转换为数字——这也不复杂:

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
Stream<String> stream2 = stream.map(String::valueOf);
Stream<Integer> stream3 = stream2.map(Integer::parseInt);
将流转换StringInteger

将字符串转换为URI

数据转换操作可能是资源和时间密集型的。假设我们要将字符串集合转换为 URI 对象。这很容易做到,因为 URI 构造函数将字符串作为参数。

ArrayList<String> list = new ArrayList<String>();
list.add("https://google.com");
list.add("https://linkedin.com");
list.add("https://yandex.com");

Stream<URI> stream = list.stream().map( URI::new );
将流转换StringURI

我们创建了一个集合并用 3 个网址填充了它。然后我们Stream<String>从集合中得到一个对象,然后从那个流中我们得到一个Stream<URI>对象。我们向 map 方法传递了对将用于将每个字符串转换为 URI 的方法的引用。

此方法(构造函数)必须将 aString作为参数。一切似乎都很完美……


2. 例外情况

我们可能期望上面的代码应该可以工作,但它不会——程序不会编译。并不是因为我们在某个地方犯了错误,而是因为 Java 的创造者搞砸了。

曾几何时,他们有一个绝妙的主意,就是URISyntaxException在类构造函数中添加一个已检查的异常 () URI!并且此类异常必须包装在try-catch.

所以我们代码的最后一行看起来像这样:

Stream<URI> stream = list.stream().map(str ->
{
  try
  {
     return new URI(str);
  }
  catch (URISyntaxException e)
  {
     e.printStackTrace();
     return null;
  }
});

我们能说什么?在使用检查异常之前你应该三思。在构造函数中使用它们之前请三思。