多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### [应用函数到元素](https://lingcoder.gitee.io/onjava8/#/book/14-Streams?id=%e5%ba%94%e7%94%a8%e5%87%bd%e6%95%b0%e5%88%b0%e5%85%83%e7%b4%a0) * `map(Function)`:将函数操作应用在输入流的元素中,并将返回值传递到输出流中。 * `mapToInt(ToIntFunction)`:操作同上,但结果是**IntStream**。 * `mapToLong(ToLongFunction)`:操作同上,但结果是**LongStream**。 * `mapToDouble(ToDoubleFunction)`:操作同上,但结果是**DoubleStream**。 在这里,我们使用`map()`映射多种函数到一个字符串流中。代码示例: ~~~ // streams/FunctionMap.java import java.util.*; import java.util.stream.*; import java.util.function.*; class FunctionMap { static String[] elements = { "12", "", "23", "45" }; static Stream<String> testStream() { return Arrays.stream(elements); } static void test(String descr, Function<String, String> func) { System.out.println(" ---( " + descr + " )---"); testStream() .map(func) .forEach(System.out::println); } public static void main(String[] args) { test("add brackets", s -> "[" + s + "]"); test("Increment", s -> { try { return Integer.parseInt(s) + 1 + ""; } catch(NumberFormatException e) { return s; } } ); test("Replace", s -> s.replace("2", "9")); test("Take last digit", s -> s.length() > 0 ? s.charAt(s.length() - 1) + "" : s); } } ~~~ 输出结果: ~~~ ---( add brackets )--- [12] [] [23] [45] ---( Increment )--- 13 24 46 ---( Replace )--- 19 93 45 ---( Take last digit )--- 2 3 5 ~~~ 在上面的自增示例中,我们用`Integer.parseInt()`尝试将一个字符串转化为整数。如果字符串不能被转化成为整数就会抛出`NumberFormatException`异常,此时我们就回过头来把原始字符串放到输出流中。 在以上例子中,`map()`将一个字符串映射为另一个字符串,但是我们完全可以产生和接收类型完全不同的类型,从而改变流的数据类型。下面代码示例: ~~~ // streams/FunctionMap2.java // Different input and output types (不同的输入输出类型) import java.util.*; import java.util.stream.*; class Numbered { final int n; Numbered(int n) { this.n = n; } @Override public String toString() { return "Numbered(" + n + ")"; } } class FunctionMap2 { public static void main(String[] args) { Stream.of(1, 5, 7, 9, 11, 13) .map(Numbered::new) .forEach(System.out::println); } } ~~~ 输出结果: ~~~ Numbered(1) Numbered(5) Numbered(7) Numbered(9) Numbered(11) Numbered(13) ~~~ 我们将获取到的整数通过构造器`Numbered::new`转化成为`Numbered`类型。 如果使用**Function**返回的结果是数值类型的一种,我们必须使用合适的`mapTo数值类型`进行替代。代码示例: ~~~ // streams/FunctionMap3.java // Producing numeric output streams( 产生数值输出流) import java.util.*; import java.util.stream.*; class FunctionMap3 { public static void main(String[] args) { Stream.of("5", "7", "9") .mapToInt(Integer::parseInt) .forEach(n -> System.out.format("%d ", n)); System.out.println(); Stream.of("17", "19", "23") .mapToLong(Long::parseLong) .forEach(n -> System.out.format("%d ", n)); System.out.println(); Stream.of("17", "1.9", ".23") .mapToDouble(Double::parseDouble) .forEach(n -> System.out.format("%f ", n)); } } ~~~ 输出结果: ~~~ 5 7 9 17 19 23 17.000000 1.900000 0.230000 ~~~ 遗憾的是,Java 设计者并没有尽最大努力去消除基本类型。