sla*_*dan 8 java optional java-8 java-stream
在Java8流中,我可以使用该mapToInt方法创建一个IntStream,它将OptionalInt为某些动作返回s(如findFirst).为什么没有类似的东西Optional?
int i = Stream
.of("1") // just as an example
.mapToInt(Integer::parseInt) // mapToInt exists for streams
.findFirst() // this even returns an OptionalInt!
.getAsInt(); // quite handy
int j = Optional
.of("1") // same example
.map(Integer::parseInt) // no mapToInt available
.get().intValue(); // not as handy as for streams
Run Code Online (Sandbox Code Playgroud)
显然,Java-9中的Optionals中会出现一些其他方法.但是,它不太可能mapToInt被添加.几天前我在core-libs-dev中讨论了这个问题.这是Paul Sandoz的回答:
我不想去那里,我的反应
Optional*变成了一个*Stream.添加的参数mapOrElseGet(注意原始变体返回U)是可以从中组合的其他功能.
而后来:
我认为用Optional来污染OptionalInt等是好的,但是我想避免它用于另一个方向.
总的来说,我认为这是合理的.原始流的目的是在处理许多原始值时提高性能.然而,对于Optional使用原始值的性能增益,如果有的话是相当边缘的(与流相比,通过JIT编译器优化的额外装箱的机会更大).即使项目Valhalla不会出现在Java-9中,它也会逐渐向前发展,在Java-10中我们最终会看到泛型的基本原理,因此这些原始选项将变得完全没必要.在这种情况下,在Object Optional和primitive 之间添加更多的互操作性OptionalInt似乎是不必要
在StreamAPI中具有特殊化是有意义的,因为流可以表示处理数百万个元素的批量操作,因此性能影响可能是巨大的.但据我所知,即使这个决定也不是没有争议.
对于Optional最多只携带一个元素的性能影响并不能证明其他API的合理性(如果有任何影响).目前尚不清楚是否OptionalInt真的有必要等等.
关于方便,我不能明白你的观点.以下作品:
int j = Optional.of("1").map(Integer::parseInt).get();
Run Code Online (Sandbox Code Playgroud)
你的建议是添加另一个允许重写上述语句的API
int j = Optional.of("1").mapToInt(Integer::parseInt).getAsInt();
Run Code Online (Sandbox Code Playgroud)
我不明白这是如何提高便利性的......
但遵循逻辑,使用Java 9,您可以编写
int j = Optional.of("1").stream().mapToInt(Integer::parseInt).findFirst().getAsInt();
Run Code Online (Sandbox Code Playgroud)
这更加提升了这种"便利性"......
| 归档时间: |
|
| 查看次数: |
1027 次 |
| 最近记录: |